静态constexprvariables与function

将浮点常量声明为static constexprvariables和下面的例子中的函数是否有区别?还是仅仅是风格问题?

 class MY_PI { public: static constexpr float MY_PI_VAR = 3.14f; static constexpr float MY_PI_FUN() { return 3.14f; } } 

constexpr函数

函数有一个优点,自由variables没有(直到C ++ 14):他们可以很容易地模板没有一些类的样板。 这意味着你可以有一个精确的你的pi取决于模板参数:

 template<typename T> constexpr T pi(); template<> constexpr float pi() { return 3.14f; } template<> constexpr double pi() { return 3.1415; } int main() { constexpr float a = pi<float>(); constexpr double b = pi<double>(); } 

但是,如果您决定使用static成员函数而不是自由函数,则不会比static成员variables更短也不容易。

constexprvariables

使用variables的主要优点是…好。 你想要一个常数,对吗? 它澄清了意图 ,这可能是这里最重要的一点。

你仍然可以和一个类有同样的行为,但是,如果你的类是一个包含其他math常量的类,你将不得不像这样使用它:

 constexpr float a = constants<float>::pi; 

或者像这样,如果你的class级只是代表pi

 constexpr double = pi<double>::value; 

在第一种情况下,您可能更喜欢使用variables,因为写起来会更短,并且会真正显示您正在使用常量而不是尝试计算某些内容。 如果你只有一个代表pi的class级,你可以使用一个免费的constexpr函数而不是整个class级。 这将恕我直言更简单。

C ++ 14: constexprvariables模板

但是请注意,如果您select使用C ++ 14而不是C ++ 11,则可以编写以下types的constexprvariables模板:

 template<typename T> constexpr T pi = T(3.1415); 

这将允许你写这样的代码:

 constexpr float a = pi<float>; 

在C ++ 14中,这可能是做事情的首选方式。 如果您使用的是旧版本的标准,则前两个段落仍然有效。