我试图看看我是否可以创建一个异构类型,它只能在其生命周期中包含多种类型之一(任一模式),我想这样做:
TemplateBaseClass
其中typename //strong typed (heterogeneous) container
template<typename list>
struct STC
{
template<typename a>
STC(const a& value) :hc_(value), index_(TMP::elem_index<a, list>::value) {}
template<typename a>
STC(a&& value) : hc_(value), index_(TMP::elem_index<a, list>::value) {}
//imaginary compile time const
constexpr size_t index()const { return index_; }
typename TMP::index<list,index()>::type get() { return c_.get<index()>(); }
operator typename TMP::index<list,index()>::type ()const { return get(); }
private:
union_magic<list> c_;
const size_t index_;
};
是模板元类型列表,list
是用于重新检索列表元素索引的模板元函数,TMP::elem_index
是用于重新查找元素的元函数已知指数。
在我看来,没有办法跨越类数据成员和编译时常量之间的界限。我错过了什么吗?这是错误的方法吗?或者它只是在c ++中无法做到的事情,必须在运行时解决?
至于如何使用容器:
TMP::index
应显示&#34;调用int类型的函数:1&#34;。
答案 0 :(得分:1)
以下两个答案的组合是否有助于获得您想要的内容?
building and accessing a list of types at compile time
How can I get the index of a type in a variadic class template?
顺便说一下,在index_
中存储编译时元数据类没有用,它被分配并且只能在运行时使用。您可能会将其定义为static constexpr size_t kIndex
。