首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >静态常量表达式变量与函数

静态常量表达式变量与函数
EN

Stack Overflow用户
提问于 2013-04-30 04:36:43
回答 1查看 15K关注 0票数 56

将浮点常量声明为static constexpr变量和下面示例中的函数之间有区别吗,或者这只是一个风格问题?

代码语言:javascript
复制
class MY_PI
{
public:
    static constexpr float MY_PI_VAR = 3.14f;
    static constexpr float MY_PI_FUN() { return 3.14f; }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-30 17:12:36

constexpr函数

函数有一个自由变量所没有的优势(直到C++14 ):它们可以很容易地模板化,而不需要一些类样板。这意味着您可以根据模板参数使用具有一定精度的pi

代码语言:javascript
复制
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,这可能是这里最重要的一点之一。

对于一个类,你仍然可以有一个等价的行为,但是,如果你的类是一个包含各种数学常量的类,你就必须像这样使用它:

代码语言:javascript
复制
constexpr float a = constants<float>::pi;

或者,如果您的类仅表示pi,则如下所示

代码语言:javascript
复制
constexpr double = pi<double>::value;

在第一种情况下,你可能更喜欢使用变量,因为它写起来更短,这将真正表明你使用的是常量,而不是试图计算某些东西。如果你只有一个表示pi的类,那么你可以使用一个免费的constexpr函数来代替整个类。那就更简单了。

C++14:constexpr variable templates

但是,请注意,如果您选择使用C++14而不是C++11,您将能够编写以下类型的constexpr变量模板:

代码语言:javascript
复制
template<typename T>
constexpr T pi = T(3.1415);

这样你就可以像这样写代码了:

代码语言:javascript
复制
constexpr float a = pi<float>;

从C++14开始,这可能是做事情的首选方法。如果您使用的是该标准的旧版本,则前两段仍然有效。

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16287776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档