我閱讀本教程:類型(函數模板):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 n
爲expression parameter
。所以在教程Template classes (not template functions) can make use of another kind of template parameter known as an expression parameter.
中提到的觀點似乎不正確。
在
進一步閱讀也表明了相同的。
所以我所理解的是:無論是功能模板還是類模板,模板參數可以是template type parameter i.e. typename
或expression parameter
。唯一的限制是,對於表達式參數 - 它必須是constant integral expression
。編譯器不區分它是否用於function
或class
。
我的理解是否正確?
我從來沒有聽說過函數模板不能具有非類型參數。 – chris