使用专用类中的类模板的内部类型

Using a Class Template's Internal Types from a Specialized Class

本文关键字:内部 类型 专用      更新时间:2023-10-16

EDIT:在度假时,我实际上没有机会测试任何建议的解决方案,当我回来时,负责类模板的人员已经做了一些更改,使我能够绕过使用类模板中定义的类型的需要。

感谢大家的帮助。


简言之,我需要知道我是否可以使用在我的专业类的类模板中定义的(protectedstruct#typedef。例如:

这是类模板:

template<typename T>
class A : public C<T>
{
protected:
    struct a_struct { /* Class template implementation, doesn't depend on T */ };
    void foo( a_struct a );
};

我需要完全专门用于T = VAL:

template<>
class A< VAL > : public C< VAL >
{
    void foo( a_struct a )
    {
        // My implementation of foo, different from the class template's
    }
};

然而,如果我这样做,编译器会抱怨a_struct在我的专用类中是未定义的。我试着从类模板中进行专门化和继承,但结果。。。凌乱的

我看到了一些解决方案,但所有这些都涉及修改类模板,这是我(不同团队)无法轻松做到的。

想法?

不,在类模板的专业化中不能使用主模板声明的成员。这是因为从本质上讲,模板类专门化声明了一个全新的类模板,当模板参数与专门化匹配时,该模板将被应用。

不过,如果你想做像你的例子中那样的事情,你有两个选项:

  • 您可以专门化模板类成员函数。如果确实只有一个成员函数是特殊的(或者至少成员函数的数量是有限的),这是有用的
  • 您可以将成员(-type)的声明引入公共基类中

由于您在编辑中指出不能更改类模板本身,因此专门化成员函数似乎是最好的选择。

专门化仅成员函数的简化示例

template< class T>
class Printer
{
public:
    struct Guard {};
    void DoPrint( const T& val)
    {
        Guard g;
        (void)g;
        std::cout << val << 'n';
    }
};
struct Duck {};
template<>
void Printer<Duck>::DoPrint( const Duck& val)
{
    Guard g;
    (void)g;
    std::cout << "Some duckn";
}

这里的Guard仅用于证明此类型可用于DoPrint()的主实现和专用实现。

它不漂亮,但你可以这样做:

template<typename T>
class C
{
};
template<typename T>
class A : public C<T>
{
protected:
    friend A<int>;
  // ^^^^^^
    struct a_struct { /* Class template implementation, doesn't depend on T */ };
    void foo( a_struct a );
};
template<>
class A< int > : public C< int >
{
    using a_struct = typename A<void>::a_struct;
  // ^^^^^^
    void foo( a_struct a )
    {
        // My implementation of foo, different from the class template's
    }
};

或者,在专用模板中重新声明structa_struct,具有与默认模板相同的功能。

我知道这听起来可能不太好,因为你需要注入所有专门的模板。但这是我现在能想到的。