在命名空间中定义双精度常量的最佳方法是什么?

4

如何在命名空间中定义双精度常量?例如:

// constant.h
namespace constant {
    static const double PI = 3.1415926535;
}

// No need in constant.cpp

这是最好的方式吗?


2
也许你应该澄清“最佳”并展示一些其他选项。 - Thomas Matthews
1
你不需要使用 static 关键字。任何被声明为 const 的变量都是隐式的 static。 - James Kanze
1
你做得完全符合我的想法,不需要添加任何新功能。 - James Kanze
1个回答

6

I'd say:

-- In c++14:

namespace constant 
{
  template <typename T = double>
  constexpr T PI = T(3.1415926535897932385);
}

-- 在C++11中:

namespace constant 
{
  constexpr double PI = 3.1415926535897932385;
}

-- 在 c++03 中:

namespace constant 
{
  static const double PI = 3.1415926535897932385;
}

请注意,如果您的常量不具有平凡类型,并且您在共享库中,我建议避免在全局/命名空间范围内给它提供内部链接。我不知道这方面的理论,但在实践中,这确实会导致事情随机出错 :)

C++14示例与C++11示例相比有什么后果?对我来说,前者看起来过于复杂了... - Fabio A. Correa
1
@FabioA.Correa,您可以选择PI的类型,如果使用除double以外的其他类型进行操作,则不需要强制转换,而且我没有看到任何开销,除了多一行小代码。 PI是介绍变量模板的论文中使用的典型示例,对于它解决的更多问题,最好的来源仍然是该论文:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3651.pdf - Drax
@FabioA.Correa 不客气 :) - Drax
你的最后一个建议不起作用。static const double PI;甚至不应该编译。通常的解决方案是在头文件中只需编写double const PI = 3.14;。(如果对象是const,则它隐式为static.) - James Kanze
您所有的建议都具有内部链接。使用任何其他东西而不是 double const PI = 3.; 没有实际优势,除了增加冗余性。 - James Kanze
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接