专用模板-目的 我知道C++中的模板是什么,但是今天我看到了一些奇怪的代码: template <> void swap(foo &a, foo &b) { a.name = b.name; a.id = 1; // blah blah blah } 模板无效交换(foo&a、foo&b) { a、 name=b.name; a、 id=1; //废话废话 }

专用模板-目的 我知道C++中的模板是什么,但是今天我看到了一些奇怪的代码: template <> void swap(foo &a, foo &b) { a.name = b.name; a.id = 1; // blah blah blah } 模板无效交换(foo&a、foo&b) { a、 name=b.name; a、 id=1; //废话废话 },c++,C++,我做了一些研究,发现它被称为专门模板,或者类似的东西 如果在上面的代码中我删除模板部分,我将得到完全相同的结果。也没有像通常的模板函数那样的通用类型 我的问题是-使用它们的目的是什么?从该函数中删除模板将导致以下更改: 这将不是一个模板专门化 它不会从代码交换(a,b) 当a和/或b是可转换为foo的类型时,它可能是swap(a,b)的最佳匹配 如果没有模板部分,它将是一个重载。根据标准,您不允许在std命名空间中重载函数,但您可以专门化函数模板。非常方便。这是唯一的原因吗?@user22527

我做了一些研究,发现它被称为专门模板,或者类似的东西

如果在上面的代码中我删除
模板
部分,我将得到完全相同的结果。也没有像通常的模板函数那样的通用类型

我的问题是-使用它们的目的是什么?

从该函数中删除
模板将导致以下更改:

  • 这将不是一个模板专门化
  • 它不会从代码
    交换(a,b)
  • a
    和/或
    b
    是可转换为
    foo
    的类型时,它可能是
    swap(a,b)
    的最佳匹配

  • 如果没有模板部分,它将是一个重载。根据标准,您不允许在std命名空间中重载函数,但您可以专门化函数模板。非常方便。这是唯一的原因吗?@user2252786另一个原因也适用于非
    std
    函数,即当使用显式指定的模板参数调用函数时(甚至可能是不可约的)。想象
    模板tfoo(int)。这可以针对不同的返回类型进行专门化,但不能重载。此外,对于类来说,部分专门化非常有趣,可以添加到“为什么”这个论点中。