gpt4 book ai didi

c++ - 如何在模板化类的 'namespace' 中创建非模板化类型定义?

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:15 24 4
gpt4 key购买 nike

假设我有这个类:

template <typename T> class A {
T datum;
void foo();
}

我想用以下 typedef 和方法扩充我的类:

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;
// ...
}

因为它定义了 A<T>::Color对于不同的 T,不是 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 吗?以某种方式定义?

最佳答案

编辑

comment之后:

我认为你能得到的最好的东西是这样的:

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)非模板化。

关于c++ - 如何在模板化类的 'namespace' 中创建非模板化类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com