gpt4 book ai didi

c++ - 静态 constexpr 变量与函数

转载 作者:IT老高 更新时间:2023-10-28 13:59:29 25 4
gpt4 key购买 nike

将浮点常量声明为 static constexpr 变量和下面示例中的函数之间是否有区别,或者只是样式问题?

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

最佳答案

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 变量

使用变量的主要优点是……嗯。你想要一个常数,对吧?它阐明了意图,这可能是这里最重要的一点。

您仍然可以对类具有等效的行为,但是,如果您的类是包含杂项数学常量的类,则必须像这样使用它:

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 开始,这可能是首选的做事方式。如果您使用的是旧版本的标准,前两段仍然有效。

关于c++ - 静态 constexpr 变量与函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16287776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com