Стандарт содержит всю необходимую инфраструктуру вам нужно. Вы можете удалить весь этот код.
template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(std::forward<Args>(args)...);
}
struct train_factory {
train_factory(std::function<std::unique_ptr<locomotive>()> ml,
std::function<std::unique_ptr<freight_car>()> mc)
: make_locomotive(std::move(ml)),
, make_car(std::move(mc)) {}
std::function<std::unique_ptr<locomotive>()> make_locomotive;
std::function<std::unique_ptr<freight_car>()> make_car;
};
train_factory make_concrete_factory(double x1, double x2) {
return train_factory(
[=] { return make_unique<real_locomotive>(x1); },
[=] { return make_unique<real_car>(x2); }
);
}
int main() {
auto fact = make_concrete_factory(1.0);
auto loc = fact.make_locomotive();
}
Это похоже на все ваши требования. В этом случае функции имеют аргументы фабричной привязки (и эта привязка произвольная). Разумеется, вы также можете изменять функции, чтобы принимать аргументы, если хотите, или использовать их произвольными способами и комбинациями.
struct train_factory {
std::function<std::unique_ptr<locomotive>(double)> make_locomotive;
std::function<std::unique_ptr<freight_car>(double)> make_car;
};
train_factory make_concrete_factory() {
return train_factory {
[](double x1) { return make_unique<real_locomotive>(x1); },
[](double x2) { return make_unique<real_car>(x2); }
};
}
int main() {
auto fact = make_concrete_factory();
auto loc = fact.make_locomotive(1.0);
}
В этом вопросе есть много кода, и я не уверен, что это полезно. Что вы на самом деле пытаетесь сделать? Каким должен быть код, который вы пытаетесь достичь? – Barry
В самом конце, где он говорит «чтобы я мог это достичь» ... Я хочу иметь возможность передавать аргументы в конструктор real_train_factory, а не просто оставлять его конкретным по умолчанию ctor. Важный код находится в заголовке, который является первым. –
@ rightfold или, может быть, http://www.boost.org/doc/libs/1_58_0/libs/functional/factory/doc/html/index.html – sehe