2009-04-28 92 views
27

有時工作有時不:當編譯器可以推斷出模板參數嗎?

template <class T> 
void f(T t) {} 

template <class T> 
class MyClass { 
public: 
    MyClass(T t) {} 
}; 

void test() { 
    f<int>(5); 
    MyClass<int> mc(5); 
    f(5); 
    MyClass mc(5); // this doesn't work 
} 

有沒有辦法破解圍繞上面的例子?即強制編譯器從構造函數參數中推斷出模板參數。

這會在將來得到解決,還是有一個好的理由不會呢?

編譯器可以推斷出模板參數的一般規則是什麼?

回答

47

模板參數可以推斷函數模板當參數類型可以從模板可以推斷參數

所以在這裏可以推斷出:

template <typename T> 
void f(T t); 

template <typename T> 
void f(std::vector<T> v); 

但不是在這裏:

template <typename T> 
T f() { 
    return T(); 
} 

而不是類模板

所以通常解決你的問題是創建一個包裝的功能,類似於標準庫函數std::make_pair

template <class T> 
    class MyClass { 
    public: 
     MyClass(T t) {} 
     void print(){ 
      std::cout<<"try MyClass"<<std::endl; 
     } 
    }; 

    template <typename T> 
    MyClass<T> MakeMyClass(T t) { return MyClass<T>(t); } 

,然後調用auto a = MakeMyClass(5);實例化的類。

+0

+1,徹底。 Minor nit:建議將「當參數類型相關時」更改爲「當參數類型相關時」。 – 2009-04-28 12:30:48

相關問題