如何解决C ++中带有模板和转换大小写的多种返回类型
我试图通过提供枚举值作为模板参数来使多重返回类型函数在C ++中工作。
这是我的代码:
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{});
}
我以为我可以使用自动功能呢?我似乎只是收到一个错误,说无法推断出返回类型。这有可能吗?
解决方法
推论auto
没有问题,但是问题是auto
推论出不同的收益类型。如果要使用不同的返回类型,则需要一个编译结构,例如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;
}
,
您想要的东西是可能的,但不能使用switch
。您必须使用C ++ 17的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;
if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION)
return style.origin_proportion;
}
由于return
是模板参数,因此未使用的ATTRIBUTE
分支将被丢弃。
switch
是运行时构造。使用if constexpr
:
if constexpr (ATTRIBUTE == TEXTAttribute::FONT_NAME) return style.font_name;
else if constexpr(ATTRIBUTE == TEXTAttribute::ORIGIN_PROPORTION) {
return style.origin_proportion;
}
仅记得将所有与参数值相关的代码放在适当的if constexpr
/ else
分支中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。