Пытаясь реализовать абстрактную фабрику с Boost Factory, классы иерархии имеют параметры c-tor, уже выглядело это обсуждение: Передача аргументов в конструктор с помощью Boost Factory
Мой пример следующий:
struct base {
virtual ~base() = default;
virtual void method() = 0;
};
struct derived1 : public base {
derived1(int a1, int a2) {}
virtual ~derived1() = default;
virtual void method() {}
};
Создайте фабрику и попробуйте создать экземпляр
std::map<uint8_t, boost::function<base*(int, int)>> my_factory;
my_factory[0] = boost::bind(boost::factory<derived1*>(), _1, _2) ;
std::unique_ptr<base> derived_instance(my_factory.at(0)(1, 2));
Проблема это вообще не компилируется с ошибкой в boost :: bind cannot convert argument 1 from 'int' to 'int &'
Я понимаю природу ошибки, по некоторым причинам boost :: bind ожидает неконстантную ссылку, но я передаю rvalue, на который нельзя ссылаться. Конечно, после изменения параметров конструктора derived1
для ссылок все компилируется, но это будет выглядеть уродливо. Как правильно использовать этот шаблон?
Более абстрактный вопрос — стоит ли использовать Boost Factory с C ++ 14? Реализации кажутся немного устаревшими, я ожидал чего-то вариативного
Компилятор C ++ Visual Studio 2015
Boost 1.61
Задача ещё не решена.
Других решений пока нет …