从模板中提取数字参数

时间:2017-06-03 06:32:50

标签: c++11 template-meta-programming

我有以下结构:

template <size_t INDEX_SIZE, size_t GENERATION_SIZE>
struct Handle
{
    uint32_t index : INDEX_SIZE;
    uint32_t generation : GENERATION_SIZE;
};

在代码中我声明了很多类型的别名:

using Object1Handle = Handle<12, 16>;
using Object2Handle = Handle<12, 16>;
...

我希望有可能从别名中提取INDEX_SIZE和GENERATION_SIZE。它可以是宏,元模板或函数。例如:

constexpr size_t indexSize = ExtractIndexSize<Object1Handle>::IndexSize;

有可能吗?

1 个答案:

答案 0 :(得分:1)

,这是可能的。使用专业化:

template<class HandleInst>
struct ExtractIndexSize;

template<size_t index_size_, size_t generation_size_>
struct ExtractIndexSize<
  Handle<index_size_, generation_size_>
> {
  static constexpr size_t index_size = index_size_;
  static constexpr size_t generation_size = generation_size_;
};

但是,在这个简单的示例中(正如您对问题的评论中所指出的那样),static constexpr size_t也可以移至Handle

替代产生“类似getter”的语法和更少的限制

template<class HandleInst>
struct ExtractIndexSize;

template<size_t index_size_, size_t generation_size_>
struct ExtractIndexSize<
  Handle<index_size_, generation_size_>
> {
  static constexpr size_t index_size() { return index_size_; }
  static constexpr size_t generation_size() { return generation_size_; }
};