从派生类初始化const fusion boost列表

时间:2015-05-16 16:27:37

标签: c++ boost c++14 fusion

是否可以将成员融合向量初始化为派生类中指定的值而不使基类成为模板类?

像这样:

station

我知道这不起作用 - 但我希望它能让我更容易理解我的目标。

  1. 延迟向量将包含的类型的规范,直到类派生它。
  2. 通过使基类成为模板类
  3. ,而不指定向量应包含的类型

    如果不是 - 最接近它的是什么?

1 个答案:

答案 0 :(得分:1)

不需要基类作为模板的最接近的事情是使用类型擦除。您可以自己滚动¹或使用Boost Type Erasure等。选择最适合您的。

实现它的最简单方法是boost::any

示例

<强> Live On Coliru

#include <boost/any.hpp>
#include <boost/fusion/include/io.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/make_vector.hpp>
#include <string>

namespace fus = boost::fusion;

class container
{
  protected:
    boost::any children;

    template <typename T>
    container (T const& children) : children(children) {}
};

class derived : public container
{
    using V = boost::fusion::vector2<std::string, std::string>;
  public:
    derived() : 
        container(fus::make_vector(std::string("test1"),std::string("test"))){} 

    friend std::ostream& operator<<(std::ostream& os, derived const& d) {
        return os << boost::any_cast<V const&>(d.children);
    }
};

#include <iostream>

int main() {
    derived d;
    std::cout << d;
}

打印

(test1 test)

¹,例如