如何在c++中使用if-else和类型初始化
How to use if else along with type initialisation in c++?
考虑一个可以使用初始化的类"myArbPrec"
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")
。
到目前为止,我试图通过写这样的东西来调整这个答案以适应我的问题:
template<typename T>
T atof(const char * c) {
if (typeid(T) == typeid(double))
return std::atof(c);
else
return T(c);
}
然而,这失败了,因为即使typeid(T) == typeid(double)
总是false,else
分支仍然被编译,这使得即使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++17,您将能够将原始模板与if constexpr
一起使用,这将起作用。
提议的文件在这里。
我没有编译器来测试它。
作为@101010建议的替代解决方案,您可以使用标签调度和重载函数:
#include<type_traits>
#include<utility>
#include<cstdlib>
#include<iostream>
template<typename>
struct tag {};
double atof(tag<double>, const char *c) {
std::cout << "double" << std::endl;
return std::atof(c);
}
template<typename T>
T atof(tag<T>, const char * c) {
std::cout << "something else" << std::endl;
return T{c};
}
template<typename T>
T atof(const char * c) {
return atof(tag<std::decay_t<T>>{}, c);
}
int main() {
atof<double>("3.1");
atof<std::string>("bar");
}
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- 使用if-else将数字转换为单词
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- C++ If/Else 语句被跳过
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 如何将 if else 语句重写为 switch 语句
- 在 C++ 中的 if-else if- else 语句期间更改变量
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 具有嵌套 if-else 的循环的时间复杂度
- 避免在字符串中分支 if-else 以类型调度
- IF-ELSE语句的Lambda表达式的返回类型扣除
- 如何在if/else序列中定义未知类型的全局变量
- 我的程序C++找到三角形的类型,我的if-else语句遇到问题
- C++ 计数字符类型(大写、小写、数字、特殊),不带 if-else、三元或开关大小写.任何想法
- 编写 if then else 类型语句的简洁方法
- If-else基于正在使用的类型定义
- 如何在c++中使用if-else和类型初始化