基于指针类型的模板函数重载?

Template function overloading on basis of pointer type?

本文关键字:函数 重载 类型 于指针 指针      更新时间:2023-10-16

模板函数是否可以根据指针类型重载,如下所示:

1)
template <class T>
void Function(T* ptr, char m)
{
...
}
2)
template <class T>
void Function(T i, char m)
{
...
}

它在C++有效吗?

篇二: 我可以在指针类型的基础上专化(模板专业化)函数如下(在这种情况下忽略上述重载)吗?

3)
template<>
inline  Function<string>(string sptr, char m)
{
...
}

PS:当我尝试将模板 1 与 3 专门化时,出现编译错误。

根据指针类型重载模板是完全合法的。当同一函数模板专用化匹配多个重载函数模板时,将执行重载函数模板的部分排序以选择最佳匹配项。

在这种情况下,它是通过调用函数模板专用化的重载解析来完成的。有关详细信息,请参阅函数模板

甚至您的函数模板专用化也是完全有效的。

引用 cppreference 的函数模板

具体而言,部分排序在以下情况下发生:

  1. 调用函数模板专用化的重载解析
template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);
  1. 当函数模板专用化的地址被占用时
template<class X> void f(X a);
template<class X> void f(X* a);
void (*p)(int*) = &f;
    当放置运算符
  1. 删除时,选择该功能模板专用化以匹配放置运算符 new
  2. 当 friend 函数声明、显式实例化或显式专用化引用函数模板专用化时
template<class X> void f(X a);  // first template f
template<class X> void f(X* a); // second template f
template<> void f<>(int *a) {} // explicit specialization
// template argument deduction comes up with two candidates:
// foo<int*>(int*) and f<int>(int*)
// partial ordering selects f<int>(int*) as more specialized

是的,拥有这两个模板是完全合法的,它们会很好地相互过载。专业化也是完全合法的。