Передача аргументов в конструктор с помощью Boost Factory
Я довольно новичок во всей фабричной реализации и в результате, возможно, мой вопрос будет звучать неправильно и не очень четко определен. Итак, в нескольких словах я хочу иметь фактологию повышения для инициализации ветви производных классов, и до сих пор мне удавалось сделать это для классов с пустыми конструкторами. Позвольте мне представить мою текущую реализацию фабрики наддува для двух небольших классов:
Base.h:
#ifndef BASE_H_
#define BASE_H_
#include <vector>
#include <map>
#include "boost/function.hpp"
class base {
protected:
typedef boost::function <base *()> basefactory;
public:
base();
virtual ~base();
int a;
static std::map<std::string,base::basefactory>& b_factory();
};
#endif /* BASE_H_ */
Base.cpp:
#include "base.h"
base::base() {
// TODO Auto-generated constructor stub
}
base::~base() {
// TODO Auto-generated destructor stub
}
static std::map<std::string,base::basefactory>& base::b_factory()
{
static std::map<std::string,base::basefactory>* ans =
new std::map<std::string,base::basefactory>();
return *ans;
}
Derived.h:
#ifndef DERIVED_H_
#define DERIVED_H_
#include "boost/function.hpp"
#include "boost/functional/factory.hpp"
#include <iostream>
#include "base.h"
class derived : public base {
public:
derived();
virtual ~derived();
int b;
static class _init {
public:
_init() {
base::b_factory()["derived"] = boost::factory<derived*>();
}
}_initializer;
};
#endif /* DERIVED_H_ */
Derived.cpp:
#include "derived.h"
derived::derived() {
// TODO Auto-generated constructor stub
}
derived::~derived() {
// TODO Auto-generated destructor stub
}
derived::_init derived::_initializer;
Итак, описанный выше код прекрасно работает для пустого конструктора классов, но я очень не уверен, как изменить код в случае, если конструкторы базового и производного классов должны получить аргументы. Более конкретно, скажем, что я хочу иметь базовый конструктор:
base(int alpha) {
a = alpha;
}
А также производный конструктор:
derived(int alpha, int beta) : base( alpha ) // in order to pass the argument alpha to the base class
{
b = beta;
}
Итак, как уже было сказано выше, я действительно не уверен, какие модификации мне нужно сделать, чтобы добиться того, чтобы вышеупомянутая реализация надстройки работала для моего кода. Я знаю, что здесь, в других местах онлайн, есть несколько постов для параметризованных конструкторов, но им не удалось заставить меня правильно понять, как это сделать самому, и именно поэтому я сделал этот пост ей. Любая помощь / предложение будет высоко ценится!
1 ответ
Если вы хотите фабрику, которая принимает 2 аргумента, вы можете сделать:
std::map<std::string, boost::function<base* (int, int)>> factories;
factories["derived"] = boost::bind(boost::factory<derived*>(), _1, _2);
std::unique_ptr<base> b{factories.at("derived")(42, 52)};
Если вы хотите исправить аргументы, вы можете сделать
std::map<std::string, boost::function<base* ()>> factories;
factories["derived"] = boost::bind(boost::factory<derived*>(), 42, 52);
std::unique_ptr<base> b{factories.at("derived")()};