【问题标题】:Compile Time Calculate Template Size编译时间计算模板大小
【发布时间】:2016-06-05 14:03:07
【问题描述】:

我正在尝试想出一种方法,让用户能够使用定义来设置对象池大小,

#define POOL_SIZE 0.2

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

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

这可能以符合 std98 的方式执行吗?编译器说不是常量表达式。

【问题讨论】:

  • 那个模板参数是双精度而不是整数,如果你用 static_cast 包装它是否有效?
  • @Borgleader 感谢它的工作我只尝试了 c 样式转换而不是静态的

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


【解决方案1】:

你可以稍微改变一下策略并使用

#define POOL_SIZE 512

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

【讨论】:

    【解决方案2】:

    在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;
         ^~~~~~~~~~~~~~~~~~~~~~~~
    

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

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

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

    (我假设您的 poolsize 模板参数是 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2013-05-30
      • 2012-11-03
      相关资源
      最近更新 更多