枚举作为模板参数

enum as template parameter

本文关键字:参数 枚举      更新时间:2023-10-16
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();
}