我正在阅读本教程:
http://www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/
有人提到 但是,模板类型参数并不是唯一可用的模板参数类型。模板类**(不是模板函数)**可以使用另一种称为表达式参数的模板参数。
所以我写了一个程序:
#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) 可以使用另一种称为表达式参数的模板参数。
中提到的观点似乎是不正确的。
进一步阅读
也有同样的建议。
所以我的理解是:无论是函数模板还是类模板,模板参数都可以是模板类型参数即typename
或表达式参数
。唯一的限制是,对于表达式参数 - 它必须是 constant integral expression
。编译器不会区分它是针对 function
还是 class
。
我的理解对吗?
最佳答案
是的,您似乎理解正确。
这方面的一个用例是编写通用代码,但仍然可以获得编译时常量的好处(例如更好的编译器优化)。
一个例子是 std::array ,它的长度采用这样一个模板 size_t
参数。另一个例子是 std::enable_if ,它使用 bool
。
关于c++ - 模板参数类型(对于函数模板): C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592713/