c++ - 如何在 C++ 中使用 if else 和类型初始化?

标签 c++ c++11

考虑一个可以使用初始化的“myArbPrec”类

myArbPrec("0.1");

(例如,它表示任意精度类型)。

我希望我的代码与 myArbPrecdouble 兼容。用户使用模板设置类型。

在程序中使用的模板类中有一些常量,例如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,这使得它失败即使 Tdouble

最佳答案

使用 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/

相关文章:

c++ - 包装递归可变参数模板类会改变行为。为什么?

c++ - 如何从字符串中删除第一个单词?

c++ - 在 C++ 中将文件读入内存的最快方法?

c++ - 使用 strncmp 函数在 Arduino IDE 中出错

C++:访问大型数据集中的重成员变量的最有效和简洁的方法

c++ - resolve_initial_references 导致 SystemException

c++ - gcc 不接受默认模板参数中的包扩展

c++ - 引用的统一初始化

c++ - 为 C++ 类生成 set/get 方法

c++ - 初始化列表的简单示例