C++ 如何定义包含模板参数(C+;+;)的枚举类型

C++ 如何定义包含模板参数(C+;+;)的枚举类型,c++,templates,enums,C++,Templates,Enums,我想将类型T定义为一个枚举,它可以取值{a,B,C,S1,…,Sk},但是因为k是一个编译时变量,所以我不能只键入它 template <size_t k> struct T { enum class { A, B, C, S_1, ..., S_k }; }; 模板 结构T{ 枚举类{ A、 B,C,S_1,…,S_k }; }; 如何定义类型?这不是使用枚举,但它提供了非常相似的语法(需要C++14或更高版本): 模板 结构T{ 髓鞘结构{ 静态con

我想将类型T定义为一个枚举,它可以取值{a,B,C,S1,…,Sk},但是因为k是一个编译时变量,所以我不能只键入它

template <size_t k>
struct T {
   enum class {
      A, B, C, S_1, ..., S_k
   };
};
模板
结构T{
枚举类{
A、 B,C,S_1,…,S_k
};
};

如何定义类型?

这不是使用
枚举,但它提供了非常相似的语法(需要C++14或更高版本):

模板
结构T{
髓鞘结构{
静态constexpr int A=0;
静态constexpr int B=1;
静态constexpr int C=2;
模板2
int test4=T::MyEnum::S;//编译错误:0<1
除了尖括号之外,语法是类似的,并且都将在编译时计算,因此没有运行时开销


如果您想让它们返回一个
enum
,您可以定义自己的
int
,并为
enum
交换
int
(缺点是您不能将
struct
enum
命名为相同的名称).

如果您不知道枚举数有多少,您打算如何引用这些枚举数?为什么整数类型不足以满足您的用例?枚举是编译类型替换;类枚举只添加类型检查,但在其他方面是相同的。在运行时没有变量和范围。因此,您不能将它们当作一个变量来使用vector.Answer1:我知道在我使用它们的时候有多少个。只是在我定义类型的时候没有。Answer2:我希望在编译时清楚。同样的原因是我们使用枚举而不是int。也许一个例子可以帮助澄清它。假设T是机器人的位置,它可以位于位置a、B、C或k个其他点之一,我定义e一个基于此的运行时变量“v”。因此,在代码中,我可以看到机器人将要去哪里。但是,你什么时候会真正键入像
S_19
这样的名称?难道“其他点”不需要被数字变量引用才能对它们做很多有用的事情吗?你是对的,我永远不会写S_19,但我如何才能证明这些都是“位置”?在代码中是否有enum的替代方案可以澄清这一点?这看起来很好。唯一的问题是在访问它时,当您必须键入T和enum时,会有一些冗余。我只需要其中一个来声明类型是什么。有什么原因我不能省略T而只使用MyEnum吗?@Milad是的,可以省略
T
,但是只有在
MyEnum
可以访问的情况下,例如在
struct
的声明中,您可以只键入
MyEnum::B
而不键入
T
。枚举类的规则相同,如果从外部而不是从内部访问枚举,您仍然需要
T:
的声明>@Milad我看到你是新来的,所以我会提醒你,如果这回答了问题,那么你应该将它标记为答案,这样它就不会显示在“未回答”选项卡中(加上互联网积分总是很好:)
template<size_t k>
struct T {
    struct MyEnum {
        static constexpr int A = 0;
        static constexpr int B = 1;
        static constexpr int C = 2;
        template<size_t n,
            typename = typename std::enable_if<n != 0 && n <= k>::type>
        static constexpr int S = Enum::C + n;
    };
};
 int test1 = T<2>::MyEnum::A;
 int test2 = T<2>::MyEnum::S<2>; // Equivalent to S_2
 int test3 = T<2>::MyEnum::S<3>; // Compile error: 3 > 2
 int test4 = T<2>::MyEnum::S<0>; // Compile error: 0 < 1