枚举作为模板参数

时间:2018-07-19 11:12:16

标签: c++ templates

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()中处于模式。到目前为止,我所有的尝试都失败了。请告诉我们是否有可能达到预期的行为,并给我您的建议

2 个答案:

答案 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();
}