57

如下例所示,将浮点常量声明为static constexpr变量和函数之间是否有区别,还是只是风格问题?

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

1 回答 1

57

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

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

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

这将允许您像这样编写代码:

constexpr float a = pi<float>;

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

于 2013-04-30T09:12:35.890 回答