考虑一个可以使用初始化的“myArbPrec”类
myArbPrec("0.1");
(例如,它表示任意精度类型)。
我希望我的代码与 myArbPrec
和 double
兼容。用户使用模板设置类型。
在程序中使用的模板类中有一些常量,例如0.1
。这些常量将以用户选择的相应类型表示。
我的问题是:如何根据所选类型在初始化的代码中放置一个常量?具体来说,对于myArbPrec
,应该初始化为myArbPrec("0.1")
。对于double
,应该初始化为double(0.1)
。
问题是我不能使用 myArbPrec(0.1)
,因为这会将 first 转换为 double,可能会失去精度,然后才转换为 myArbPrec
。因此,如果我的模板参数是T
,我就不能写成T(0.1)
。但是因为 double("0.1")
在语法上不正确,我也不能使用 T("0.1")
。
到目前为止,我尝试适应this answer对于我的问题,写这样的东西:
template<typename T>
T atof(const char * c) {
if (typeid(T) == typeid(double))
return std::atof(c);
else
return T(c);
}
然而,这失败了,因为 else
分支仍然被编译,即使 typeid(T) == typeid(double)
总是 false,这使得它失败即使 T
是 double
。
最佳答案
使用 atof
函数的互斥 SFINAE 重载:
namespace foo {
template<typename T>
typename std::enable_if<std::is_same<T, double>::value, T>::type atof(const char * c) {
return std::atof(c);
}
template<typename T>
typename std::enable_if<!std::is_same<T, double>::value, T>::type atof(const char * c) {
return T(c);
}
}
关于c++ - 如何在 C++ 中使用 if else 和类型初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592572/