c++ - 表达模板化数字文字的最佳方式是什么?

标签 c++ templates c++11 type-conversion literals

我有一个函数可以简化成这样:

template<class T>
T foo(T x)
{
  return 123.45 / x;
}

我想确保数字文字 123.45 与 x 的类型相同。假设 T 可以是任何数字类型:signed/unsigned char 到 long-long 或 float 到 long-double。

指示 123.45 应为 T 类型的最现代方法是什么?

我的要求

  • 不应发出警告(每个警告都打开)。
  • 我希望小数 123.45 在计算时具有 T 的精度。
  • 我想要实现这些目标的最优雅的解决方案。

正在考虑的问题

  • “旧式类型转换”,即 (T)123.45在 C++ 中基本上已弃用。
  • static_cast<T>(123.45)似乎是正确的 Actor 类型。但是,它很冗长,我从未见过它用在文字上。
  • 我不确定在 T 为 123.45L 的情况下是否需要后缀(例如 long double )以获得最大精度,或者如果编译器将自动使用最高精度的十进制到二进制转换。

2014 年 5 月 7 日更新

将我的代码库中的数百个转换更改为 T(123.45) 形式后,我发现有时这种语法不可用。例如,你不能做 long double(123.45)因为 C++ 不支持多 token 类型构造函数。在这些情况下,我选择了 static_cast<long double>(123.45) .

最佳答案

简单的怎么样

template<class T>
T foo(T x)
{
  return T(123.45) / x;
}

这将允许自定义数字类接受构造函数中的值。

关于c++ - 表达模板化数字文字的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22380778/

相关文章:

c++ - 函数模板推导指南?

c++ - 用于二进制搜索的错误简单函数(C++)

c++ - 如何通过交叉编译构建调试 Qt dll 问题?

c++ - 从枚举器获取枚举类型

c++ - 获取 C++ 模板参数包的总大小(以字节为单位)

c++ - 在另一个线程中使用线程 vector : error attempting to reference a deleted function

c++ - 如何将成员模板类声明为封闭类的友元?

c++ - 使用 std::chrono 将 32 位 unix 时间戳转换为 std::string

c++ - clEnqueueNDRangeKernel 阻塞执行

c++ - 如何使用 memset 将 volatile 数组设置为零?