考虑一类“myArbPrec”,可以使用被初始化如何在C++中使用if和else类型初始化?
myArbPrec("0.1");
(例如它代表一个任意精度的类型)。
我希望我的代码兼容myArbPrec
和double
。用户使用模板设置类型。
在程序中使用的模板类中有一些常量,例如0.1
。这些常数将以用户选择的相应类型表示。
我的问题是:如何根据选择的类型在代码中初始化一个常量?具体来说,对于myArbPrec
,应该初始化为myArbPrec("0.1")
。对于double
,应该初始化为double(0.1)
。
的问题是,我不能使用myArbPrec(0.1)
,因为这种转换第一翻一番,可能会丢失精度,然后才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)
始终是假的,这使得即使在T
是double
时也会失败。您atof
功能
除了答案,你可以期待C++ 17,其中'如果constexpr'是一个存在的东西,例如:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0292r1.html –