2013-06-21 41 views
0

這是用於構建給定類型對象的通用函數。感謝variadics模板如果找到了匹配的構造函數,將會構造T,否則編譯器會在編譯時拋出一個錯誤。用於處理每個參數類型的Rercusive模板

template <typename T, typename... Args> 
void * build(Args... args){ 
    return new T(args...); 
} 

現在假設,而不是通過N個參數,我想從別的地方得到他們,例如從一個單身的話,我必須根據每個類型以某種方式的爭論擴大和調用方法參數:

class Singleton{ 

public: 
    template <typename T> 
    static T* getIstance(){ 
     return reinterpret_cast<T*>(istances_map[typeid(T).has_code()]); 
    } 
}; 

現在假設我打電話

MyClass * p = build<MyClass,Foo,Bar>(); 

我想要做的是,MyClass的構造函數被調用,Foo和酒吧的相應istances從獲得單身。這應該是和實例展開的模板代碼:

MyClass * p = new MyClass(Singleton::getIstance<Foo>(), 
          Singleton::getIstance<Bar>() 
         ); 

我有我需要一個遞歸模板與元組沿着解決問題的感覺。但這只是一種感覺。

回答

1
template <typename T, typename... Args> 
T* build() 
{ 
    return new T{Singleton::getInstance<Args>()...}; 
} 
+1

你 「拼寫錯誤」'getIstance';) – Casey

+0

計算器不要讓我編輯只是 「1個字」 的拼寫錯誤。這真的很難決定一票贊成最佳答案,最後我翻轉了一枚硬幣:/。對不起,其他人。但也許會很好,看看遞歸解決方案^^(如果有人想在選擇中沒有隨機性的最佳答案) – GameDeveloper

1

你嘗試:

template <typename T, typename... Args> 
T* build() { 
    return new T(Singleton::getIstance<Args>()...); 
} 
相關問題