基于指针类型的模板函数重载?
Template function overloading on basis of pointer type?
模板函数是否可以根据指针类型重载,如下所示:
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 的函数模板
具体而言,部分排序在以下情况下发生:
- 调用函数模板专用化的重载解析
template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);
- 当函数模板专用化的地址被占用时
template<class X> void f(X a);
template<class X> void f(X* a);
void (*p)(int*) = &f;
- 当放置运算符
- 删除时,选择该功能模板专用化以匹配放置运算符 new
- 当 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
是的,拥有这两个模板是完全合法的,它们会很好地相互过载。专业化也是完全合法的。
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载