Я читал этот учебник:Тип шаблона параметров (шаблоны функций): 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