静态constexprvariables与function
将浮点常量声明为static constexpr
variables和下面的例子中的函数是否有区别?还是仅仅是风格问题?
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更短也不容易。
constexpr
variables
使用variables的主要优点是…好。 你想要一个常数,对吗? 它澄清了意图 ,这可能是这里最重要的一点。
你仍然可以和一个类有同样的行为,但是,如果你的类是一个包含其他math常量的类,你将不得不像这样使用它:
constexpr float a = constants<float>::pi;
或者像这样,如果你的class级只是代表pi
:
constexpr double = pi<double>::value;
在第一种情况下,您可能更喜欢使用variables,因为写起来会更短,并且会真正显示您正在使用常量而不是尝试计算某些内容。 如果你只有一个代表pi的class级,你可以使用一个免费的constexpr
函数而不是整个class级。 这将恕我直言更简单。
C ++ 14: constexpr
variables模板
但是请注意,如果您select使用C ++ 14而不是C ++ 11,则可以编写以下types的constexpr
variables模板:
template<typename T> constexpr T pi = T(3.1415);
这将允许你写这样的代码:
constexpr float a = pi<float>;
在C ++ 14中,这可能是做事情的首选方式。 如果您使用的是旧版本的标准,则前两个段落仍然有效。