基于模板参数的模板枚举类型

Templated enum types based on template parameters

本文关键字:枚举 类型 于模板 参数      更新时间:2023-10-16

我想知道如何做到这一点:假设我有一个类a,里面有枚举B

class A {
enum B {
};
};

我想创建一个函数,将a作为模板,然后假设a具有枚举B类型,并将其val作为参数?我试过类似的东西:

template<typename T>
static void Foo(T t, T::B b) {}

但那没用。。有人有主意吗?

谢谢。

您需要告诉编译器T::B是一个类型,因为它是一个依赖名称,并且默认情况下被假定为非类型。

template<typename T>
static void Foo(T t, typename T::B b) {}
//                   ^^^^^^^^

您还应该公开枚举。此代码示例有效:

class A {
 public:
  enum B {x, y, z};
};
template<typename T>
static void Foo(T t, typename T::B b) {}
int main()
{
  Foo(A(), A::x); // OK
}

如需深入解释,请参阅我必须将"template"answers"typename"关键字放在哪里以及为什么

您必须使用typename关键字才能使其工作:

static void Foo(T t, typename T::B b) {}
                        ^

并且CCD_ 2必须是公共的。

typename关键字用于指定模板定义或声明中的依赖名称是类型。它是模板参数中class的同义词。

C++标准状态:

模板声明或定义中使用的名称依赖于模板的参数被假定为不命名类型,除非适用的名称查找查找类型名称或该名称是限定的通过关键字typename。

所以,除非您明确声明typename T::B b,否则编译器将假定T::B b是值类型,而不是类型名称。

总结:

class A {
 public:
  enum B {enum1, enum2};
};
template<typename T>
static void Foo(T t, typename T::B b) {}
int main()
{
  A a;
  Foo(a, a::enum1); 
}

typename