2015-04-18 152 views
1

編輯:我決定編輯這篇文章爲未來的讀者。簡而言之,它顯示了一種可接受的方式來調用模板列表中的模板類型的構造函數。例如,以下內容:抽象工廠改進

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

我收到了同樣的錯誤。 「Candidate ctor(隱式移動ctor)不可行:需要1個參數,但提供了2個 候選ctor(隱式拷貝ctor)不可行:需要1個參數,但提供了2個參數 候選ctor(隱式默認值ctor)不可行:需要0個參數,但提供了2個。「 –

+0

@Gustav:您遇到問題的確切代碼是什麼?哦,我使用了你的編譯器可能不支持的統一初始化,所以你可能需要添加一個構造函數到train_factory並直接調用它,而不是使用統一的init。 – Puppy

+0

concrete_factory和abstract_factory構造在這些帖子頂部的頭文件中。 –