编译时间计算模板大小

时间:2016-02-23 16:13:09

标签: c++ g++ c-preprocessor

我试图想出一种让用户能够使用define设置对象池大小的方法,

#define POOL_SIZE 0.2

然后在编译期间执行以下操作,

Pool<int,((POOL_SIZE * 1024)/sizeof(int))> pool;

这是否可以以符合std98的方式执行此操作?编译器说不是一个持续的表达。

2 个答案:

答案 0 :(得分:0)

您可以稍微改变策略并使用

#define POOL_SIZE 512

Pool<int,((POOL_SIZE)/sizeof(int))> pool;

答案 1 :(得分:0)

在clang下编译给出了原因:

./cexpr.cpp:36:10: error: conversion from 'double' to 'std::size_t' (aka 'unsigned long') is not allowed in a converted constant expression
pool<1024 * 0.2 / sizeof(int)> p;
     ^~~~~~~~~~~~~~~~~~~~~~~~

这里的重要词是:转换常量表达式,因为您在模板扩展期间从double转换为(int?size_t?)。这是非法的。

很遗憾你没有c ++ 14,因为这是合法的:

static constexpr std::size_t mypoolsize = 1024 * 0.2 / sizeof(int);
pool<mypoolsize> p;

(我假设你的poolize模板参数是std :: size_t)

另一种(c ++ 98)方法是清理宏,以便强制转换结果为正确的类型:

#define POOLSIZE(sz, factor) std::size_t(sz * factor / sizeof(int))

或者在您的情况下......

#define POOLSIZE(sz, factor) int(sz * factor / sizeof(int))