枚举作为模板参数
enum as template parameter
class myclass {
private:
const myenum value;
public:
enum myenum { first, second }
myclass(myenum value) : value(value) {}
template < /* enable if myclass::value == myclass::myenum::first */ >
void myfunc();
template < /* enable if myclass::value == myclass::myenum::second */ >
void myfunc();
}
int main(){
myclass instance(myclass::myenum::first);
instance.myfunc();
}
value
是模式,如果您愿意的话,开关myfunc()
会运行。到目前为止,我所有的尝试都失败了。请告诉我是否有可能实现所需的行为,并给我你的建议
const myenum value;
是一个运行时值,不能用于在编译时控制myfunc
的实例化。如果您想这样做,您需要将myenum
作为模板参数传递给myclass
:
template <myenum value>
class myclass {
// ...
};
否则,您可以在运行时在myfunc
中使用if
语句:
void myfunc()
{
if(value == myenum::first) { /* ... */ }
else { /* ... */ }
}
以下是一种只在特定函数而不是整个类上保留模板功能的方法。要付出的代价是从";运行时间";类实例到";编译时";函数调用是包含switch case
语句的mycall()
函数。
#include <iostream>
enum myenum { first, second };
template <myenum E> void myfunc();
template <> void myfunc <first>(){
std::cout << "First" << "n";
}
template <> void myfunc <second>(){
std::cout << "Second" << "n";
}
class myclass {
private:
myenum e;
public:
myclass(myenum e): e(e){};
void mycall() const{
switch(e){
case first:
myfunc<first>();
return;
case second:
myfunc<second>();
return;
}
}
};
int main(){
myenum e = first;
myclass instance(e);
instance.mycall();
}
相关文章:
- 有没有办法使用类的私有枚举值作为模板参数?
- 从可变参数创建枚举?
- 在运行时使用枚举器值作为模板函数的模板参数的元程序
- 基于枚举参数调用专用模板方法
- 枚举作为模板参数
- 如何将枚举类作为类模板参数包含在内?
- 如何从枚举类值中指定模板函数参数中的数组大小?
- 是否可以使用泛型枚举类型作为函数的参数?
- C++ - 使用模板类中的枚举而不带模板参数
- 将函数参数限制为某些枚举值
- C++ 成员函数的多个定义,基于枚举模板参数
- 如何根据枚举参数返回其他类型
- 枚举类别和布尔模板参数的放松constexpr要求
- C++ 在C++中通过引用将枚举作为默认参数传递时出错
- 不能将类实例化为 LHS 值,并将限定枚举作为参数 (C++ VS2015)
- 是否可以使用 static_cast 从可变参数枚举创建 boost::mpl::list_c
- 枚举作为基类的模板参数总是会因未解决的错误而失败
- 在模板参数内向前声明枚举类
- C++运行时从编译时已知集/枚举中选择模板非类型参数
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单