我想在编译时创建一个常量。这就是我的意思:
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++11来完成constexpr
,但在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
已经是一个编译时常量(constant expression)。编译器将计算它并用值替换用途。请注意,您只能从常量表达式(在编译时计算)设置枚举数的值。
事实上,这是一个过早的优化。在大多数情况下,您甚至不需要定义枚举,因为给定编译时间常数M
(模板参数),所有编译器都将替换M*M*M
为正确的值。这对编译器来说是微不足道的,没有生产级编译器会做不到。