C++ 使用constexpr返回函数值C++;

C++ 使用constexpr返回函数值C++;,c++,templates,enums,constants,constexpr,C++,Templates,Enums,Constants,Constexpr,这是我的密码: enum class MYENUM { A = 0, B = 1 }; template<MYENUM T> void somefunc() { std::cout << "working" << std::endl; } struct A { constexpr MYENUM mytype() { return MYENUM::A; } }; struct B { A ob

这是我的密码:

enum class MYENUM {
A = 0, B = 1
};

template<MYENUM T>
void somefunc() {
    std::cout << "working" << std::endl;
}
struct A {
    constexpr MYENUM mytype() {
        return MYENUM::A;
    }
};
struct B {
    A obj;
    void f() {
        somefunc<obj.mytype()>(); //'this cannot be used in a constant expression'
    }
};
enum类MYENUM{
A=0,B=1
};
模板
void somefunc(){
标准::cout
我所要求的是不可能做到的吗

是和否。
这是一个运行时值,实际上不能在常量表达式中使用

但是在您的例子中,它似乎不需要是成员函数,所以您可以声明它为静态的

struct A {
    static constexpr MYENUM mytype() {
        return MYENUM::A;
    }
};
现在它可以工作了

我所要求的是不可能做到的吗

是和否。
这是一个运行时值,实际上不能在常量表达式中使用

但是在您的例子中,它似乎不需要是成员函数,所以您可以声明它为静态的

struct A {
    static constexpr MYENUM mytype() {
        return MYENUM::A;
    }
};

现在它可以工作了。(

if而不是使其静态,使用if-else并手动调用fcn怎么办?这是一种不好的做法吗?例如if(x==MYENUM::A)somefunc();if-else或开关将在运行时而不是编译时求值。如果
mytype()的返回值
确实每个
A
的实例不同,那么是的,这将是实现它的唯一方法。@jasbindra00有效。如果函数不是constexpr,这基本上就是你必须做的。请记住,每个模板实例化都是一个完全不同的函数-
somefunc
是一个与完全不同的函数ode>somefunc
,因此编译器必须知道您要调用哪个函数,这就是为什么您不能执行
somefunc
。当您使用
if
时,编译器会生成if中的所有函数,程序会决定调用哪个函数。@user253751我认为这里使用模板对我来说是不合适的。我想我只使用一个函数通过请求添加MYENUM参数来执行运行时评估。之所以选择模板来执行此操作,是因为这样可以消除用户插入未列出枚举类型的可能性(例如static_cast(100000)).但是现在,当与if/else解决方案相比较时,它似乎违背了函数的目的..我认为如果用户插入未列出的枚举类型,我将抛出一个异常。这看起来合理吗?是的,在用户输入进一步进入程序逻辑之前,应尽快验证用户输入。如果不将其设为静态,而将其设为se if-else并手动调用fcn?这是一种不好的做法吗?例如,if(x==MYENUM::A)somefunc();if-else或开关将在运行时而不是编译时求值。如果
mytype()的返回值
确实每个
A
的实例不同,那么是的,这将是实现它的唯一方法。@jasbindra00有效。如果函数不是constexpr,这基本上就是你必须做的。请记住,每个模板实例化都是一个完全不同的函数-
somefunc
是一个与完全不同的函数ode>somefunc
,因此编译器必须知道您要调用哪个函数,这就是为什么您不能执行
somefunc
。当您使用
if
时,编译器会生成if中的所有函数,程序会决定调用哪个函数。@user253751我认为这里使用模板对我来说是不合适的。我想我只使用一个函数通过请求添加MYENUM参数来执行运行时评估。之所以选择模板来执行此操作,是因为这样可以消除用户插入未列出枚举类型的可能性(例如static_cast(100000))。但是现在,当与if/else解决方案相比较时,它似乎违背了函数的目的。。我认为如果用户插入未列出的枚举类型,我将抛出一个异常。这似乎合理吗?是的,在进入程序逻辑之前,应尽快验证用户输入。请注意
obj.mytype()如果obj是constexpr,则
将起作用。请注意,如果obj是constexpr,则
obj.mytype()将起作用。