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

标签 c++ templates namespaces constants

我想定义可用于任意类型的自定义常量(例如 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/

相关文章:

C++ 校验和 CRC32 验证

C++ 'operator>>' 中的 'std::cin >>' 有歧义

无需滚动的html模板

c++ - 模板类的容器对象

javascript - 使用 JavaScript 命名空间

php - codeigniter 3命名空间问题

C++ 编辑文本文件

c++ - 在 C++ 中将 double 转换为字符串会给出奇怪的字符(汉字?)

c++ - 在 C++ 中重载类的运算符 []

django - 在 Django 模板中构建动态 IMG URL