is_enum<>另一个模板函数不起作用/编译



如果我不使用enum作为参数类型,我有一个模板函数可以正常工作(这里是浓缩形式;它使用stringstreams将字符串转换为另一个tjer类型(:

template<typename T>
void section::getVal(std::string key,T& var)
{   
std::stringstream ss; ss.str(key);
ss>>var;
}

现在我希望该函数能与任何enum一起使用,所以我尝试了

enum slimit {lower,higher,between,nolim};
template<typename T>
void section::getVal(std::string key,T& var)
{   
std::stringstream ss; 
ss.str(key);
if(!std::is_enum<T>::value)
ss>>var;
else
{  
int h;
ss>>h;
var=static_cast<T>(h);
}
}

不幸的是,这并不能编译

(error: no match for 'operator>>' (operand types are 'std::stringstream {aka std::__cxx11::basic_stringstream<char>}' and 'sensact::slimit')
ss>>var;)

如果我用不关心它编译的类型(int n=0;(的东西替换ss>>var;,则If区别/is_enum工作得很好,如果varenum类型,则执行else块。

那么,我如何才能让它工作,为什么它不编译呢?

虽然if语句只执行一个分支,但它仍然编译所有分支。由于其中一个分支中的代码格式不正确,因此会出现错误。

如果你想有条件地编译一些分支,你可以像这样使用constexpr if

if constexpr (!std::is_enum<T>::value)
ss >> var;
else
{  
int h;   // in general, std::underlying_type_t<T> instead of int,
// to allow for other enumeration types
ss >> h;
var=static_cast<T>(h);
}

感谢@Jarod42在评论中提出underlying_type建议。

最新更新