我想删除一个模板类的函数中的float到bool转换性能警告,在这种情况下,boost::enable_if
感觉有些过头了。
是否有一种方法可以在编译时检查模板的类型,然后根据类型使用适当的强制转换?
T val;
float val2;
val = (T)(val+val2); // warning here for objects of type bool
我想要这样的东西:
#if (boost::is_same<CType, bool>::value == true)
val = (val+val2)!=0;
#else
val = (T)(val+val2);
#endif
我不希望只是禁用警告。
编辑:添加了visual studio标签
您可以将操作拉到一个单独的模板中,并重载bool
:
template <typename T1, typename T2>
T1 add(T1 const & v1, T2 const & v2) {
return static_cast<T1>(v1 + v2);
}
template <typename T2>
bool add(bool v1, T2 const & v2) {
return (v1 + v2) != 0;
}
T val;
float val2;
val = add(val,val2); // hopefully no warning now.
只需将is_same
与if块一起用于bool的"specialized"。它是标准库的一部分,以防您不想使用Boost。
template<typename T>
void foo(T val1) {
T val;
float val2;
if (std::is_same<T, bool>::value == true)
val = (val1 + val2) != 0;
else
val = val1 + val2;
}
因为它是一个模板函数,我希望编译器优化分支,获得与真正的模板专用化相同的结果。