我试图想出一种让用户能够使用define设置对象池大小的方法,
#define POOL_SIZE 0.2
然后在编译期间执行以下操作,
Pool<int,((POOL_SIZE * 1024)/sizeof(int))> pool;
这是否可以以符合std98的方式执行此操作?编译器说不是一个持续的表达。
答案 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))