2011-06-26 75 views
2

我經常發現需要使用以下模式:C++:根據參數實例化模板化類

template<typename T> 
class SomeClass : public Base { 
    SomeClass(const T& t) {...} 
    ... 
}; 
template<typename T> 
SomeClass<T>* makeSomeClass(const T& t) { 
    return new SomeClass<T>(t); 
} 

並使用它:

Base* = makeSomeClass(123); 

當我不想明確指定T時這很有用,因爲它非常複雜(函數類型等)和函數參數可以隱式推導出類型。
如果沒有額外的「make」功能,有沒有辦法做到這一點?爲什麼模板推導只能在函數參數中工作而不能在構造函數參數中工作?

+0

見http://stackoverflow.com/questions/ 984394 /爲什麼不推斷模板參數從構造函數 – Nick

+0

可能重複[\ [C++ \]當模板參數推演失敗](http://stackoverflow.com/questions/5528096/c-when-template-參數 - 扣除 - 失敗) – bobbymcr

回答

3

不,沒有額外的make功能沒有辦法做到這一點。

它不能與構造函數一起工作的原因是因爲它會非常複雜。試想一下:

template <typename T> 
struct Foo 
{ 
    Foo(const T& val) { ... } 
    Foo(const Foo<T>& other) { ... } // Copy constructor 
}; 

Foo<int> x; 

,如果我再調用什麼:

Foo(x); 

這是否給我一個Foo< Foo<int> >還是我呼籲Foo<int>拷貝構造函數?

它會在太多的地方模棱兩可,所以額外的功能是必要的。

請注意,您可以自動化一點通過使用模板模板創建的化妝功能:

template <template <typename> class TemplateClass, typename Type> 
TemplateClass<Type> make(const Type& x) 
{ 
    return TemplateClass<Type>(x); 
} 

然後你可以使用:

make<SomeClass>(123); // returns a SomeClass<int> 
0

有沒有一種方法沒有額外的功能?不,沒有。爲什麼演繹只適用於功能?因爲你實際上提供了參數。如果它被允許類,那麼推斷出模板參數將是情況下,唯一的方式,當一個構造函數被調用初始化,這使得大量的附加規則和例外情況和複雜的事情,

+0

如複製構造函數和轉換,我woul d添加 – Nick

3

確實在工作構造函數參數,if構造函數本身就是一個模板。不同之處在於,當您使用助手時,您正在使用函數模板,其中編譯器可以推導出該類型。如果沒有幫助程序,則使用模板,其中編譯器在調用(非模板)構造函數之前必須以某種方式推斷該類型。