2014-02-06 197 views
1

我閱讀本教程:類型(函數模板):C++

http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/

,並有人提到However, template type parameters are not the only type of template parameters available. Template classes **(not template functions)** can make use of another kind of template parameter known as an expression parameter.

所以我寫了一個程序:

#include <iostream> 

using namespace std; 

    template<typename T,int n> 
    bool Compare(T t,const char* c) 
    { 
    if (n != 1) 
    { 
    cout << "Exit Failure" << endl; 
    exit(EXIT_FAILURE); 
    } 

    bool result=false; 
    cout << c << endl; 
    cout << t << endl; 
    cout << t.compare(c) << endl; 
    if(t.compare(c) == 0) 
    result = true; 

    return result; 
    } 




int main() 
{ 
    string name="Michael"; 

    if (Compare<string,1>(name,"Sam")) 
    cout << "It is Sam" << endl; 
    else 
    cout << "This is not Sam" << endl; 
    return 0; 
    } 

並得到了輸出:

$ ./ExpressionParameter 
Sam 
Michael 
-1 
This is not Sam 

顯然,這裏模板參數取int nexpression parameter。所以在教程Template classes (not template functions) can make use of another kind of template parameter known as an expression parameter.中提到的觀點似乎不正確。

Non-type template parameters

進一步閱讀也表明了相同的。

所以我所理解的是:無論是功能模板還是類模板,模板參數可以是template type parameter i.e. typenameexpression parameter。唯一的限制是,對於表達式參數 - 它必須是constant integral expression。編譯器不區分它是否用於functionclass

我的理解是否正確?

+2

我從來沒有聽說過函數模板不能具有非類型參數。 – chris

回答

1

是的,你似乎正確地理解了這一點。

這樣做的一個用例是編寫通用代碼,但仍然得到編譯時常量的好處(如更好的編譯器優化)。

一個例子是std::array,其參數長度爲size_t。另一個例子是std::enable_if,它使用bool