将浮点常量声明为static constexpr
变量和下面示例中的函数之间有区别吗,或者这只是一个风格问题?
class MY_PI
{
public:
static constexpr float MY_PI_VAR = 3.14f;
static constexpr float MY_PI_FUN() { return 3.14f; }
}
发布于 2013-04-30 17:12:36
constexpr
函数
函数有一个自由变量所没有的优势(直到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
成员变量更短或更容易编写。
constexpr
变量
使用变量的主要优点是...井。你想要一个常量,对吧?It 澄清了intent,这可能是这里最重要的一点之一。
对于一个类,你仍然可以有一个等价的行为,但是,如果你的类是一个包含各种数学常量的类,你就必须像这样使用它:
constexpr float a = constants<float>::pi;
或者,如果您的类仅表示pi
,则如下所示
constexpr double = pi<double>::value;
在第一种情况下,你可能更喜欢使用变量,因为它写起来更短,这将真正表明你使用的是常量,而不是试图计算某些东西。如果你只有一个表示pi的类,那么你可以使用一个免费的constexpr
函数来代替整个类。那就更简单了。
C++14:constexpr
variable templates
但是,请注意,如果您选择使用C++14而不是C++11,您将能够编写以下类型的constexpr
变量模板:
template<typename T>
constexpr T pi = T(3.1415);
这样你就可以像这样写代码了:
constexpr float a = pi<float>;
从C++14开始,这可能是做事情的首选方法。如果您使用的是该标准的旧版本,则前两段仍然有效。
https://stackoverflow.com/questions/16287776
复制相似问题