c++ - 模板参数类型(对于函数模板): C++

标签 c++

我正在阅读本教程:

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) 可以使用另一种称为表达式参数的模板参数。 中提到的观点似乎是不正确的。

进一步阅读

Non-type template parameters

也有同样的建议。

所以我的理解是:无论是函数模板还是类模板,模板参数都可以是模板类型参数即typename表达式参数。唯一的限制是,对于表达式参数 - 它必须是 constant integral expression。编译器不会区分它是针对 function 还是 class

我的理解对吗?

最佳答案

是的,您似乎理解正确。

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

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

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

相关文章:

c++ - 如何发出 libcurl HTTP Web 请求?

c++11数组传递给函数错误

c++ - Qgraphicsscene 背景不变

c++ - 成员引用基类型 'char' 不是 C++ 中的结构或 union

c++ - 是否可以使用 C++ 创建图像?

C++ 使用参数包的声明

c++ - 在来自相机的视频上显示一个矩形

c++ - 为什么移动构造函数需要其成员的默认构造函数?

c++ - 寻找设计模式以减少虚拟方法的重载

c++ - 同一内存地址的两个不同值