递归模板转发声明的更好的解决方法?

时间:2015-03-07 19:39:34

标签: c++ c++11 c++14

我有一个潜在的递归模板化结构类型(实际上是一个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选项)

0 个答案:

没有答案