Инициализация константного списка поддержки Fusion из производного класса

Можно ли инициализировать вектор слияния членов со значением, указанным в производном классе, не делая базовый класс шаблоном?

как это:

class container
{
const auto children;
container (auto children):children (children){}
}

class derived : public container
{
derived():container(make_vector(string("test1"),string("test"))){} // http://www.boost.org/doc/libs/1_57_0/libs/fusion/doc/html/fusion/container/generation/functions/make_vector.html
}

Я знаю, что это не сработает, но я надеюсь, что это облегчит понимание моей цели.

  1. задержка спецификации типов, которые будет содержаться в векторе, до тех пор, пока из него не получится класс.
  2. Без указания типов вектор должен содержать базовый класс как шаблонный класс

Если нет — что ближе к этому?

2

Решение

Самое близкое, что не требует, чтобы базовый класс был шаблоном, — это использовать стирание типов. Вы можете бросить свой собственный ¹ или использовать Boost Type Erasure и т. Д. Выберите то, что подходит вам больше всего.

Самый простой способ достичь этого будет boost::any:

Образец

Жить на Колиру

#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)

Например,

1

Другие решения


По вопросам рекламы [email protected]