Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中带模板和开关盒的多个返回类型+; 我试图通过提供EnUM值作为模板参数来获得C++中的多重返回类型函数。_C++_Templates_Enums_Return - Fatal编程技术网

C+中带模板和开关盒的多个返回类型+; 我试图通过提供EnUM值作为模板参数来获得C++中的多重返回类型函数。

C+中带模板和开关盒的多个返回类型+; 我试图通过提供EnUM值作为模板参数来获得C++中的多重返回类型函数。,c++,templates,enums,return,C++,Templates,Enums,Return,这是我的密码: static enum class TEXTAttribute { ORIGIN_PROPORTION, FONT_NAME }; struct MyStruct { std::string font_name; sf::Vector2f origin_proportion; }; template<TEXTAttribute ATTRIBUTE> auto GetTextAttribute(const MyStruct& style

这是我的密码:

static enum class TEXTAttribute {
    ORIGIN_PROPORTION, FONT_NAME
};

struct MyStruct {
    std::string font_name;
    sf::Vector2f origin_proportion;
};
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const MyStruct& style){
    switch (ATTRIBUTE) {
    case TEXTAttribute::FONT_NAME: {return style.font_name; break; }
    case TEXTAttribute::ORIGIN_PROPORTION: {return style.origin_proportion; break; }
    }
}
int main() {
    GetTextAttribute<TEXTAttribute::FONT_NAME>(MyStruct{});
}
静态枚举类TEXTAttribute{
来源\比例、字体\名称
};
结构MyStruct{
std::字符串字体名称;
sf::矢量2F原点_比例;
};
模板
自动GetTextAttribute(const MyStruct&style){
开关(属性){
case TEXTAttribute::FONT_NAME:{return style.FONT_NAME;break;}
case TEXTAttribute::ORIGIN_比例:{return style.ORIGIN_比例;break;}
}
}
int main(){
GetTextAttribute(MyStruct{});
}

我想我可以做到这一点,因为我使用自动?我似乎只是得到了一个错误,说返回类型无法推断。这是可能的吗?

推导出
自动
没有问题,但问题是
自动
推导出不同的返回类型。如果希望有不同的返回类型,则需要编译构造,例如
If constexpr

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
模板
自动GetTextAttribute(const std::array statestyles){
auto&style=statestyles.at(0);
if constexpr(ATTRIBUTE==texttribute::FONT\u NAME)
返回style.font\u名称;
如果constexpr(ATTRIBUTE==texttribute::ORIGIN\u比例)为else
返回样式。原点\比例;
}

推断
自动
没有问题,但问题是
自动
推断为不同的返回类型。如果希望有不同的返回类型,则需要编译构造,例如
If constexpr

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
模板
自动GetTextAttribute(const std::array statestyles){
auto&style=statestyles.at(0);
if constexpr(ATTRIBUTE==texttribute::FONT\u NAME)
返回style.font\u名称;
如果constexpr(ATTRIBUTE==texttribute::ORIGIN\u比例)为else
返回样式。原点\比例;
}

您想要的是半可能的,但不需要使用
开关
。如果constexpr,则必须使用C++17的

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
模板
自动GetTextAttribute(const std::array statestyles)
{
auto&style=statestyles.at(0);
if constexpr(ATTRIBUTE==texttribute::FONT\u NAME)
返回style.font\u名称;
if constexpr(ATTRIBUTE==TEXTAttribute::ORIGIN\u比例)
返回样式。原点\比例;
}

未调用的
返回
分支将被丢弃,因为
属性
是一个模板参数。

您想要的是半可能的,但不能使用
开关
。如果constexpr
,则必须使用C++17的

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
模板
自动GetTextAttribute(const std::array statestyles)
{
auto&style=statestyles.at(0);
if constexpr(ATTRIBUTE==texttribute::FONT\u NAME)
返回style.font\u名称;
if constexpr(ATTRIBUTE==TEXTAttribute::ORIGIN\u比例)
返回样式。原点\比例;
}

未调用的
返回
分支将被丢弃,因为
属性
是一个模板参数。

开关
是一个运行时构造。如果constexpr
,则使用

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
如果constexpr(ATTRIBUTE==texttribute::FONT\u NAME)返回style.FONT\u NAME;
如果constexpr(ATTRIBUTE==texttribute::ORIGIN\u比例)为else{
返回样式。原点\比例;
}

如果constexpr
/
else
分支,请记住将所有依赖于参数值的代码放在appropirate中。

开关
是一个运行时构造。如果constexpr,则使用

template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles) {
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)  
        return style.font_name;
    else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)  
       return style.origin_proportion;
}
template<TEXTAttribute ATTRIBUTE>
auto GetTextAttribute(const std::array<MyStruct,3> statestyles)
{
    auto& style = statestyles.at(0);
    if constexpr(ATTRIBUTE == TEXTAttribute::FONT_NAME)
        return style.font_name;
    if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
        return style.origin_proportion;
}
如果constexpr(ATTRIBUTE==texttribute::FONT\u NAME)返回style.FONT\u NAME;
如果constexpr(ATTRIBUTE==texttribute::ORIGIN\u比例)为else{
返回样式。原点\比例;
}

只要记住,如果constexpr
/
else
分支,则将所有依赖于参数值的代码放在appropirate中。

即使编译时知道
属性,运行时也要检查
switch
语句。因此,就编译器而言,两个
return
语句都可以运行,它们试图返回不同的类型<代码>如果constexpr
可能工作
std::conditional
肯定会。即使在编译时知道
属性
switch
语句在运行时检查它。因此,就编译器而言,两个
return
语句都可以运行,它们试图返回不同的类型<代码>如果constexpr可能工作<代码>标准::有条件的肯定会。哇,在同一时间发布:)这被认为是好的还是坏的做法?if/else不是比switch要花费更多的时间吗?不,事实上,这在技术上更有效,因为
交换机没有运行时成本。如果没有交换机的运行时成本,这不是会提高效率吗?(抱歉,这里是新手)@jasbindra00:“这被认为是好的还是坏的做法?”这与
tuple
get
函数的工作原理没有什么不同。“if/else会不会比开关盒花费更多的时间?”它是
constexpr
;根据定义,条件测试在编译时解析。这就是允许它丢弃
return
语句的原因。哇,正好在同一时间发布:)这被认为是好的还是坏的做法?if/else不是比switch要花费更多的时间吗?不,事实上,这在技术上更有效,因为
交换机没有运行时成本。如果没有交换机的运行时成本,这不是会提高效率吗?(抱歉,这里是新手)@jasbindra00:“这被认为是好的还是坏的做法?”这与
tuple
get
函数的工作原理没有什么不同。“if/else会不会比开关盒花费更多的时间?”它是
constexpr
;根据定义,条件测试在编译时解析。这就是它可以丢弃化学需氧量的原因