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

时间:2012-05-19 00:00:07

标签: c++ hash

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

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,但我认为如果只执行一次并且在编译期间它会更酷。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

最好用 C ++ 11 constexpr完成,但在 C ++ 03 中,您仍然可以使用元函数执行此操作:

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

它肯定是凉爽的,但我认为你太担心它太早了。

答案 1 :(得分:2)

我认为您误解了您在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替换正确的值。这对于编译器来说是微不足道的,并且没有生产级编译器会无法实现它。