C++:如何在编译时创建常量

C++: How to create a constant at compile time?

本文关键字:创建 常量 编译 C++      更新时间:2023-10-16

我想在编译时创建一个常量。这就是我的意思:

template <int M = 31>
int fast_hash(int prev_hash, int c1, int c3)
{
    enum {m3 = m*m*m;}
    return m * prev_hash - m3 * c1 + c3;
}

在上面的例子中,我可以在每次调用函数时计算 m3 = m*m*m,但我认为如果只在编译时这样做一次会更酷。我该怎么做?

最好使用 C++

11constexpr 来完成,但在 C++03 中,您仍然可以使用元函数来完成:

template< int M >
struct some_calculation
{
    static const int value = M * M * M;
};

它当然更酷,但我认为你担心得太多了,太早了。

我认为您误解了您提供的代码在C++中的作用:

template <int M = 31>
int fast_hash(int prev_hash, int c1, int c3)
{
    enum {m3 = m*m*m;}
    return m * prev_hash - m3 * c1 + c3;
}

在原始代码中,m3已经是一个编译时常量(常量表达式(。编译器将计算它并用值替换用法。请注意,只能从常量表达式(在编译时计算(设置枚举器的值。

事实上,这是一个过早的优化。在大多数情况下,您甚至不需要定义枚举,因为给定编译时常量M(模板参数(,所有编译器都将用适当的值替换M*M*M。这对于编译器来说实现起来是微不足道的,没有生产级编译器会做不到这一点。