浮点常量的编译时转换
compile-time conversions of floating point constants
这个问题指的是我之前的问题:模板中的浮点转换
我想防止浮点常量的运行时转换。在我上一个问题中采取的普遍观点是,例如,允许在运行时进行float(.5)
转换。但是呢:
template <typename A, typename B>
constexpr A convert(B const a)
{
return a;
}
这里讨论了保证constexpr
函数的编译时计算的断言:什么时候在编译时计算 constexpr 函数?
constexpr
+ assert
组合是否是在编译时完成此类转换的唯一保证方法?
溶液:
经过很多挠头,我得出的结论是,我提供的convert
功能是不必要的。我能得到的最好的是:
#define CONVERT(T, V) static constexpr T const T##_##V(V)
int main()
{
CONVERT(float, 1);
::std::cout << float_1 << std::endl;
return 0;
}
最好的选择是::std::integral_constant
的floating_point_constant
对应物,但可惜,不可能写一个。
这比我想象的还要容易:
int a = 1;
constexpr auto b = convert<float>(a);
不编译
const int a = 1;
constexpr auto b = convert<float>(a);
constexpr auto c = convert<float>(1);
constexpr auto d = convert<float>(1 + 2);
constexpr auto e = convert<int>(1.0 + 2.0);
确实(带有关于未使用变量的明显警告;-))
相关文章:
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 在编译时将常量字符* 转换为常量 char_type*
- 将编译时常量向量转换为堆分配版本
- 编译时间文本到数字转换 (atoi)
- 如何在编译时将齐次元组转换为数组?
- PX 转换例程编译问题
- 从DLL导出函数,LoadLibrary()需要用TEXT转换的字符串才能编译而不会出错
- 由于类型从 C 转换为 C++,无法编译错误 C2440
- 编译时出错 - 从 DWORD 到 LPCVOID 的转换
- 编译时将字符*转换为字节
- 在编译时将强类型枚举器转换为其基础类型?
- is_same和variadic模板编译时错误无效转换
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 尝试转换 std::chrono::d uration 会导致"rep cannot be a duration"编译错误
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 为什么这种转换方法不编译?
- 窄转换编译警告.如何解决它
- C++非常量到常量转换编译错误
- Android将C++转换/编译为Neon
- 隐式类型转换编译失败,为什么?