我有以下结构:
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;
有可能吗?
答案 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_; }
};