2015-04-18 4 views
1

Отредактировано: I want to edit this post для будущих читателей. Проще говоря, он показывает приемлемый способ вызова конструкторов типов шаблонов в списке шаблонов. Например, следующее:Аннотация Усовершенствования фабрики

int main() 
{ 
    unique_ptr<factory> real_widget_factory(new widget_factory(5.0, 6.0)); 
} 

Вместо того, чтобы просто быть ограничена:

unique_ptr<factory> real_widget_factory(new widget_factory()); // empty 
+0

В этом вопросе есть много кода, и я не уверен, что это полезно. Что вы на самом деле пытаетесь сделать? Каким должен быть код, который вы пытаетесь достичь? – Barry

+0

В самом конце, где он говорит «чтобы я мог это достичь» ... Я хочу иметь возможность передавать аргументы в конструктор real_train_factory, а не просто оставлять его конкретным по умолчанию ctor. Важный код находится в заголовке, который является первым. –

+0

@ rightfold или, может быть, http://www.boost.org/doc/libs/1_58_0/libs/functional/factory/doc/html/index.html – sehe

ответ

1

Стандарт содержит всю необходимую инфраструктуру вам нужно. Вы можете удалить весь этот код.

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); 
} 
+0

Я получаю те же ошибки, которые я получал. «Кандидат ctor (неявный ход ctor) не является жизнеспособным: требуется 1 аргумент, но 2 предоставлены. Кандидат ctor (неявный экземпляр ctor) нежизнеспособен: требуется 1 аргумент, но 2 предоставлены. Кандидат ctor (неявный по умолчанию ctor) не является жизнеспособным: требуется 0 аргументов, но 2 предоставлены ». –

+0

@Gustav: Каков точный код, с которым у вас есть проблема? О, я использовал единую инициализацию, которую ваш компилятор может еще не поддерживать, поэтому вам может потребоваться добавить конструктор в train_factory и вызвать его напрямую, вместо использования единого init. – Puppy

+0

Структуры specific_factory и abstract_factory в файле заголовка в верхней части сообщения. –

Смежные вопросы