C++:如何在编译时创建常量
C++: How to create a constant at compile time?
我想在编译时创建一个常量。这就是我的意思:
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
已经是一个编译时常量(常量表达式(。编译器将计算它并用值替换用法。请注意,只能从常量表达式(在编译时计算(设置枚举器的值。
事实上,这是一个过早的优化。在大多数情况下,您甚至不需要定义枚举,因为给定编译时常量M
(模板参数(,所有编译器都将用适当的值替换M*M*M
。这对于编译器来说实现起来是微不足道的,没有生产级编译器会做不到这一点。
相关文章:
- 如何创建长度由常量参数指定的数组
- 为什么当我们有常量引用时创建临时对象?
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- 如何编写模板函数来创建给定常量字符*的字符/wchar_t字符串?
- 为什么我不能使用与"常量字符*"相同的"const int*"创建一个 int 数组?
- 如何在 C++03 中没有重复代码的情况下在堆栈上创建一个非常量 C 字符串数组?
- 当大小是变量而不是常量时创建一个数组
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 如何从字符串常量创建字符数组
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 为什么当作为常量字符* 返回时会在此处创建临时字符串?[斯特劳斯特鲁普的书例]
- 如何创建 ' 字符常量
- 可视的 GNU C++不能创建常量自定义类实例的向量
- 如何创建常量字符*的静态常量数组
- C++:如何在编译时创建常量
- 从按值返回创建常量左值引用:它是如何工作的
- 如何创建常量指针的动态数组
- 创建常量share_ptr<pure_virtual_class>成员