如何在模板化类的'namespace'中创建非模板化类型定义?
How do I make non-templated typedefs in the 'namespace' of a templated class?
假设我有这样一个类:
template <typename T> class A {
T datum;
void foo();
}
我想用下面的类型定义和方法来扩展我的类:
typedef enum {Red, Green, Blue} Color;
bar(Color color) { baz(datum,color); };
问题是,我希望Color只在类中定义,而不是被模板化,也就是说,我希望能够做到:
A<int> a;
a.bar(A::Red);
现在,我不能这样做:
template <typename T> class A {
typedef enum {Red, Green, Blue} Color;
// ...
}
因为它定义了不同T的A<T>::Color
,而不是A::Color
。这:
namespace A {
typedef enum {Red, Green, Blue} Color;
}
template <typename T> class A { /* ... */ }
似乎无法编译。
typedef enum {Red, Green, Blue} A::Color;
template <typename A> class A { /* ... */ }
那么,我能以某种方式定义A::Color
吗?
EDIT
注释后:
我认为你能得到的最好的东西是这样的:
template<typename T = void> class A;
template<> class A<void>{
public:
enum Color { Red };
};
template <typename T> class A : public A<>{
T datum;
public:
void foo(){}
void bar(Color c){}
};
int main()
{
A<int> a;
a.bar(A<>::Red);
}
这有点棘手,但它所做的就是定义一个碱class A<void>
,你也可以称之为class A<>
,它只包含enum
。然后让所有其他模板专门化都继承这个类。
我认为这是最接近你正在寻找的匹配,即一个类作用域的非模板enum
。
原始回答
恐怕你必须定义一个包含enum
定义的非模板基类,然后让你的模板类从这个基类继承。
class A_base{
public:
typedef enum {Red, Green, Blue} Color;
void bar(Color color){}
};
template <typename T> class A : public A_base{
T datum;
void foo(){}
};
int main()
{
A<int> a;
a.bar(A_base::Red);
}
这将而不是将enum
带入名为A
的作用域;但它会使枚举,更重要的是,void bar(Color color)
函数非模板化。
相关文章:
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- 使用 C++17,如何创建类型到值的编译时图?
- C++ 中的对象创建类型有什么区别?
- 在 C++ 中创建类型向量
- 创建类型列表并访问每种类型的静态成员?
- 无法创建类型为无序链接列表的对象
- 如何为指针创建类型定义
- 在没有宏的情况下在 C++98 中创建类型列表时遇到问题
- 使用特定成员变量值创建类型的类型
- <T> 从类型对象创建类型<T1>对象的构造函数
- 创建类型结构的指针阵列
- C++当类型T需要构造函数时,是否可以创建类型T的std::列表
- 在C++中创建类型定义
- 是否可以在 c++ 中创建类型的向量
- 创建类型为 'this'/当前对象的指针
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?
- ptr_fun - 无法创建类型?
- 如何从继承的自定义类 c++ 创建类型
- DLL 创建类型