使用专用类中的类模板的内部类型
Using a Class Template's Internal Types from a Specialized Class
EDIT:在度假时,我实际上没有机会测试任何建议的解决方案,当我回来时,负责类模板的人员已经做了一些更改,使我能够绕过使用类模板中定义的类型的需要。
感谢大家的帮助。
简言之,我需要知道我是否可以使用在我的专业类的类模板中定义的(protected
)struct
或#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,具有与默认模板相同的功能。
我知道这听起来可能不太好,因为你需要注入所有专门的模板。但这是我现在能想到的。
相关文章:
- 嵌套模板函数采用 2 个具有相同内部类型的容器
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 如何为模板的内部类型专用化类
- 从内部类型参数推断外部类型
- 在 CUDA 中使用内部类型转换的奇怪错误
- std::enable_if使用它的内部类型,而不使用它
- 编译器找不到内部类型
- 内部类型定义和循环依赖项
- C++ 限制模板模板中的内部类型
- 部分默认使用内部类型初始化模板模板参数
- 使用专用类中的类模板的内部类型
- 使用内部类型声明
- 从匿名指针类型中检索内部类型
- 内部类型作为模板参数
- 编写泛型包装器:有条件地将模板参数中的不同类型映射到单个类内部类型
- 如何在C++中推导内部类型的外部类型
- c++ std::map内部类型初始化使用[]操作符
- 容器使用的内部类型的内存分配
- 使用内部类型作为模板参数继承模板类
- 如何获取n嵌套向量的最内部类型