如果您需要运行时参数,请使用:
void foo(E m) {}
其值为m
type E
。(注:template<E m>
不需要)
如果您想要一个编译时参数,请使用:
template<E m>
void foo() {}
并致电:
foo<A>();
或者,如果您想foo
为所有枚举类型工作:
template<typename E>
void foo(E m) {}
并且可能检查枚举
static_assert(std::is_enum<E>::value, "E is not an enumeration");
在函数体内。(如果需要,您也可以使用 SFINAEfoo
从过载集中删除,询问您是否需要帮助)
更新:解释您的原始代码及其有什么问题:
template<E m> void foo(E m) {}
// ^^^ (1) ^^^ (2)
m
(1) 是类型的编译时参数E
,(2) 是运行时参数,也称为m
类型E
。由于它具有相同的名称,因此第二个参数隐藏了第一个参数。在函数中使用名称m
只会访问第二个参数,而不能访问第一个参数。现在考虑:
template<E m1> void foo(E m2) {}
现在您可以访问不同名称下的参数,即m1
和m2
。如果你这样调用函数:
foo<A>(B);
然后m1
是A
和m2
是B
。而且两者仍然是相同的固定类型E
。它们是独立的参数,运行时参数的值不会用于编译时参数。
根据您需要的类型或参数(编译时或运行时),您只需省略不需要的参数,最终得到上述实现之一。
我不是 100% 清楚你真正的问题在哪里,这对于初学者来说并不典型,因为很难描述你并不真正理解的问题,但请确保你首先了解编译时间和运行时参数以及如何使用它们。