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()
中处于模式。到目前为止,我所有的尝试都失败了。请告诉我们是否有可能达到预期的行为,并给我您的建议
答案 0 :(得分:2)
const myenum value;
是运行时值,不能用于控制编译时myfunc
的实例化。如果要这样做,则需要将myenum
作为模板参数传递给myclass
:
template <myenum value>
class myclass {
// ...
};
否则,您可以在运行时在if
内使用myfunc
语句:
void myfunc()
{
if(value == myenum::first) { /* ... */ }
else { /* ... */ }
}
答案 1 :(得分:1)
以下是一种将模板功能仅保留在特定功能而不是整个类上的方法。
从“运行时”类实例到“编译时”函数调用所付出的代价是包含此 mycall()
语句的 switch case
函数。
#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();
}