我正在阅读本教程:

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

显然,这里的template参数将int n作为expression 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。编译器不区分是function还是class

我的理解正确吗?

最佳答案

是的,您似乎正确理解了这一点。

这样的一个用例是编写通用代码,但仍然可以获得编译时常量的好处(例如更好的编译器优化)。

一个示例是std::array,它的长度采用了这样的模板size_t参数。另一个示例是std::enable_if,它使用bool

关于c++ - 模板参数类型(对于功能模板):C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21592713/

10-17 01:28