2012-05-19 26 views
0

我想在编译时创建一个常量。这就是我的意思是: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的每一次函数被调用,但我想,如果这样做了一次,并且在这将是凉爽编译时间。我怎样才能做到这一点?

+2

我认为m3在这种情况下将是一个常数。在不断传播之后,编译器会将m3评估为一个常量。 –

回答

4

这将最好C++ 11constexpr可以做到,但在C++ 03你仍然可以做它用元函数:

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

这当然冷却器,但我认为你太担心这件事太早了。

+3

不成熟的优化毕竟是万恶之源。 – chris

+2

除了对过早优化的评论之外,这并不能解决原始代码中尚未解决的任何问题,而这会在C++中产生一个常量表达式,所以'enum {m3 = m * m * m};'(即只能在编译时通过解析常量表达式来为enums提供值) –

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。这对于编译器来说是微不足道的,并且没有生产级别的编译器会无法做到这一点。

相关问题