我有一个潜在的递归模板化结构类型(实际上是一个c ++ 11版本的boost :: variant),不幸的是,我能提出的最好的解决方法是宏,我真的很想避免。
所以给出了这种类型:
template<typename... T>
struct MyType {
using MyType_parent_t = Mytype<T...>;
/*lots more code*/
} ;
我希望能够执行以下等效:
struct value;
using value = MyType<
bool,
int,
float,
std::string,
std::vector<value>,
std::map<std::string,value>
>;
现在,显然,这不起作用,因为我无法转发声明一个模板化结构(我认为我应该能够在这种情况下,但无论如何)。
现在,这就是我现在所拥有的:
struct value : public MyType<
int,
double,
bool,
std::string,
std::map<std::string, value>,
std::vector<value>
> { INJECT_PASSTHROUGH_WRAPPER_BOILERPLATE(value) };
INJECT_PASSTHROUGH_WRAPPER_BOILERPLATE(值)将扩展为:
value() = default;
value(value const & ) = default;
value(value &&) = default;
template<typename T,
typename std::enable_if<NonSelf<T, value>()>::type* = nullptr>
value(T && op) : MyType_parent_t(std::forward<T>(op)) { }
value & operator=(value const &) = default;
value & operator=(value &&) = default;
template<typename T,
typename std::enable_if<NonSelf<T, value>()>::type* = nullptr>
value & operator=(T && val) {
*static_cast<MyType_parent_t*>(this) = val ;
return *this;
}
最大的问题是我需要包装器类型具有转发构造函数和转发分配,所以我需要大量的样板来容纳它。
我实际上有点挖掘这个解决方案,因为我甚至不需要向前声明任何东西(只要通过容器完成递归)。我只是希望我能在没有宏的情况下解决这个问题,但此时此刻,我是时候寻求帮助了。
有什么建议吗? (如果需要,我对c ++ 14开放,甚至是c ++ 1z选项)