gpt4 book ai didi

c++ - 在没有 C++14 的情况下定义模板常量的正确方法?

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:04 24 4
gpt4 key购买 nike

我想定义可用于任意类型的自定义常量(例如 floatdouble 等)。例如,假设我想定义一个值为 pi 的常量。

显而易见的解决方案是使用 #define pi 3.14159265359 ,然后 pi不会在 namespace 中,我冒着名称冲突的风险。我没有使用 C++14,所以我不能使用 variable template .我能想到的最好的方法如下:

#include <iostream>

using namespace std;

namespace constants {
template<typename T> T pi() {
return 3.14159265359;
}
}

int main() {
float pitest = 0;
pitest = constants::pi<float>();
cout << pitest << endl;
cout << constants::pi<long double>() << endl;
cout << constants::pi<int>() << endl;

return 0;
}

我现在可以在命名空间中定义这些常量,并且可以根据需要使用任意(数字)类型。然而,这至少有两个不受欢迎的特点:

  1. 它需要一个不需要的函数调用(它只是一个常量!)。
  2. 我必须在函数调用中指定类型,即使函数返回的是已知类型的变量。例如,在上面的代码中我必须使用 pitest = constants::pi<float>();而不是简单地 pitest = constants::pi();尽管 pitest显然是 float .

有更好的方法吗?

最佳答案

为什么不使用自动转换为任何类型的特殊对象?

static struct {
template<class T> operator T() const constexpr
{ return (T)3.14159265359; }
} pi;

您甚至可以为更大的类型、任意精度算术、公式系统等添加特化。

关于c++ - 在没有 C++14 的情况下定义模板常量的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940793/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com