Инициализировать список повышения const 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. Без указания типов, которые должен содержать вектор, сделав базовый класс классом-шаблоном.

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


person Hans vesselgård    schedule 16.05.2015    source источник
comment
Нет, что бы это вообще значило?   -  person Barry    schedule 16.05.2015
comment
дочерние элементы в базовом классе должны стать =make_vector(string(test1),string(test);   -  person Hans vesselgård    schedule 16.05.2015
comment
контейнер класса { const auto children; контейнер (авто дочерние элементы): дети (дети) {} друг ostream & оператор‹‹ (ostream& streamReceiver, const FuzzElementContainer& streamSender) { for_each(streamSender.children, [&](const auto& x) { streamReceiver ‹‹ x ; }); вернуть потокПолучатель; } } производный класс: общедоступный контейнер { производный():контейнер(make_vector(string(test1),string(test))){} // boost.org/doc/libs/1_57_0/libs/fusion/doc/html/fusion/container // } void main() { производный a; cout ‹‹ а; // должен напечатать тест test1 }   -  person Hans vesselgård    schedule 16.05.2015


Ответы (1)


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

Самый простой способ добиться этого — boost::any:

Образец

Жить на 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)

¹ e.g.

person sehe    schedule 16.05.2015
comment
Спасибо - на самом деле это не решило мою проблему, потому что для этого требуется, чтобы тип дочерних элементов сохранялся в производном классе. Делает невозможным повторение детей в базовом классе. Так что я думаю, делать то, что я хотел, было действительно невозможно. Но я многому научился и очень хорошо ответил. Спасибо - person Hans vesselgård; 17.05.2015
comment
Если кто-то найдет эту тему с помощью поиска в Google, я хотел бы, чтобы они знали, что я в итоге сделал. Вместо того, чтобы иметь дочерние элементы в базовом контейнере, я объявил их в производном классе и использовал en.wikipedia.org /wiki/Curiiously_recurring_template_pattern для доступа к ним из базы. - person Hans vesselgård; 04.06.2015