is_enum<>另一个模板函数不起作用/编译
is_enum<> in another template function does not work/compile
如果我不使用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
建议。
相关文章:
- 跨模板化函数编译的静态变量
- 无法使用 LoadObject() 函数编译 UE4 Actor。
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 函数编译,即使它不接受整数
- 使用C 模板函数编译时间递归
- 安卓 JNI - 'raw'函数编译失败
- C++就地析构函数编译警告
- 对 TR1 使用 boost 时提升数学特殊函数编译错误
- 显式复制构造函数编译错误
- 使用SSE内部函数编译一个简单的c++程序
- 函数编译时错误
- 模板函数编译错误
- C++:使用类型名作为基的模板类调用函数编译时错误
- 将 MATLAB 函数编译成可以在 linux 终端上运行的东西,w.out MATLAB
- boost::绑定不要使用成员模板函数编译
- C++函数编译错误
- 加速模板函数编译
- 如何在C++中使用辅助函数编译以下flex文件
- 如何让g++使用move构造函数编译c++11代码
- 同时将一组函数编译为.LIB和.DLL