2009-09-18 84 views
5

前一個模板參數可以在它後面這種方式的另一個模板參數一起使用:如何在聲明的另一個模板參數使用模板參數

template<typename T, T N> 
struct s 
{ 
}; 

但有可能引用「T」,如果它是在「N」之後聲明?

這不起作用:

template<T N, typename T> 
struct s 
{ 
}; 

我們可以幫助編譯器通過聲明前的「T」或做其他事情?

提前致謝。

編輯:作爲前兩個答覆問「你爲什麼願意這樣做?」我將解釋目標:

我想讓編譯器推斷出類型「T」,以便更容易地使用模板類。

例如:

template<typename T, T A, T B> 
struct sum 
{ 
    static T const value = A + B; 
}; 

這個模板可以採用這種方式:

sum<int, 1, 2>::value 

但它會更好,如果它可以被這樣使用:

sum<1, 2>::value 

技術上這應該是可能的,因爲編譯器知道「1」和「2」的類型:「int」,實際上它使用這些inf以找到一個功能的最佳過載。 所以通過聲明模板是這樣的:

template<T A, T B, typename T> 
struct sum 
{ 
    static T const value = A + B; 
}; 

編譯器可以使用它的能力來推斷從第一和第二個提供的信息的最後一個參數,然後找實例化的最佳模板。

回答

6

像別人說的 - 不,這是不可能的,編譯器不能從非類型模板參數(在功能的情況下推斷T類型,從功能推斷類型參數):

14.8.2.4/12

模板類型參數不能從非類型模板參數的類型推斷。

在任何情況下,無論如何不會扣除類模板的參數。一個函數模板的例子可能是

template<int> struct having_int { }; 
template<typename T, T i> void f(having_int<i>); 
int main() { having_int<0> h; f(h); } 

在這種情況下,T不會推導出int - 你必須明確地指定它。

+0

感謝您的回答:如果規範說不,它不是。 現在的問題是:爲什麼這種有限的行爲,而似乎有可能做到這一點扣除? 你有一些例子證明這個決定嗎? 謝謝。 – Pragmateek 2009-09-19 14:54:03

+0

因爲模板元編程從來沒有被表達出來? :)雖然有趣的問題。可能 - 你應該檢查這是否已經提出,或者爲C++ 1x提出這個建議。 – UncleBens 2009-09-19 15:28:09

0

你不能。我不明白你爲什麼這麼做。

0

下面是垃圾,因爲我沒有正確地閱讀你的問題。

事實上,我沒有看到你想要實現的任何一點。

#include <iostream> 

template<typename T, T N> 
struct s 
{ 
    T size() { return N; } 
}; 


int main() 
{ 
    s<int, 4> x; 
    std::cout << x.size()<< '\n'; 

    //s<float, 3.14> f; //this doesn't compile 
} 

這個爲我編譯GCC和Comeau Online。

我認爲問題出在您嘗試使用的T的類型上。非類型模板參數只支持整型類型,然後指向具有外部鏈接的對象(或類似的東西,也可能是其他一些非常有限的東西)。

相關問題