如果我不使用enum
作为参数类型,我有一个模板函数可以正常工作(这里是浓缩形式;它使用stringstream
s将字符串转换为另一个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
工作得很好,如果var
是enum
类型,则执行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
建议。