c++ - 作为函数模板参数的基本类型

标签 c++

我认为一个函数模板参数只通过类标识符来声明,例如:

template<class T1, class T2> void fun(T1 a, T2 b){}

但我发现了其他示例,其中基本类型可以用作参数:

template<int R, int C> 
void fun(double (&arr)[R][C])
{
     for(int i = 0; i < R; ++i)
     {
          for(int j = 0; j < C; ++j)
          {
               cout<<arr[i][j]<<" ";
          }
          cout<<endl;
     }
}

函数执行看起来像这样:

fun(myArray);

该机制如何运作?你能再给我一个基本类型可以用作函数模板参数的例子吗?

最佳答案

在我的旅行中,我发现了模板参数作为基本类型的三个主要用途:

一个是构建一个采用 C 风格数组的函数模板。这就是您在此处发布的内容,但我更常见的是这适用于 char数组,如:

template <size_t N, typename Char>
string MakeString (Char const (&chars)[N])
{
    return string (chars, N); 
}

int main()
{
    string hi = MakeString ("Hello");
    cout << hi; 
}

另一种用途是使用模板元编程构建一种廉价的属性系统。例如,假设您有一堆类表示某种有线协议(protocol)中的消息,并且出于测试目的,您希望将消息类的实际大小与规范规定的大小进行比较。

enum MsgType
{
    MsgType_Foo,
    MsgType_Bar
};

class FooMsg
{
    uint32_t mField;
    char mName [9];
};

class BarMsg
{
    char mPrice [8];
    static const size_t SpecSize = 8;
};

template <MsgType MT> size_t SpecSize();

template <> size_t SpecSize <MsgType_Foo> ()
{
    return 13;
}

template <> size_t SpecSize <MsgType_Bar> ()
{
    return 9;
}

int main()
{
    assert (SpecSize <MsgType_Foo> () == sizeof (FooMsg));
    assert (SpecSize <MsgType_Bar> () == sizeof (BarMsg));
}

请注意,如果您运行此程序,断言将失败,除非您执行特定于平台的操作(如 #pragma pack (push, 1) )来修复包装。这是测试旨在捕获的内容之一!

最后,另一种常见用法更为具体,但该技术可以应用于您自己的代码。在 Boost.Tuple 和现在的 C++11 中,tuple类使用模板函数 get<size_t>作为访问元素的手段。这是取自 en.cppreference.com 的示例:

#include <iostream>
#include <string>
#include <tuple>

int main()
{
    auto t = std::make_tuple(1, "Foo", 3.14);
    // index-based access
    std::cout << "(" << std::get<0>(t) << ", " << std::get<1>(t)
              << ", " << std::get<2>(t) << ")\n";
}

我想您可以将其视为前面两个示例的特例。这是更多的模板元编程技巧,结果在某些情况下非常有用。

关于c++ - 作为函数模板参数的基本类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163360/

相关文章:

c++ - 具有 k = 2 的 knnMatch 返回 0 最近邻,即使图像经过训练

c++ - 在 ANTLR4 的 Lexer 中切换流

c++ - 使用 Visual Studio C++ 进行单元测试时链接器错误

c++ - 外部 dll 中缺少 Qt 信号

c++ - C++ 中 !cin 的含义是什么?

c++ - 字符串作为常量的效率?

c++ - 当数组大小已满时如何将循环数组的内容复制到更大的数组中

c++ - 如何使用固定数组和 int 的 unordered_map?

c++ - "rvalue references for *this"有什么用?

c++ - 我的REST API客户端二维码或设置有什么问题