【问题标题】:Template function overloading on basis of pointer type?基于指针类型的模板函数重载?
【发布时间】:2019-06-10 11:13:37
【问题描述】:

模板函数能否根据指针类型重载如下:

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

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

它在 C++ 中有效吗?

第 2 部分: 我可以根据下面的指针类型专门化(模板专门化)函数(忽略这种情况下的上述重载)吗?

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

PS:当我尝试用 3 专门化模板 1 时,我得到编译错误。

【问题讨论】:

  • 你试过了吗?
  • 我试过了,它编译得很好,但不确定这样的事情是否合法有效,因为有很多情况在一个编译器上工作正常,在另一个编译器上不起作用,并且属于未定义的类别。
  • 可以完全合法地同时拥有void f(int)void f(int*)。这两个重载是来自模板还是直接定义都没有关系...
  • @Inline 问题是编译器撒谎的例子太多了。通常是由于编译器扩展(例如,在 C++ 中接受 VLA),有时甚至是由于错误。所以,虽然先咨询编译器是个好主意,但如果你对标准有一些参考,你只能是 100%...
  • 啊,我想我在看到了一个问题:其实你可以推导出e。 G。 void function(int*, char) 来自两个模板。那么该选哪一个呢?规则很简单:总是更具体的...哪一个是更具体的?嗯,第一个需要指针,而第二个可以接受anything,因此第一个更具体。有点草率的措辞,我知道,但我认为你仍然明白这一点......

标签: c++ templates overloading


【解决方案1】:

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

在这种情况下,它由overload resolution 完成,用于调用函数模板特化。欲了解更多信息,请参阅Function template

即使你的函数模板特化也是完全有效的。

引用cppreference'sFunction template

具体来说,偏序发生在以下情况:

  1. overload resolution 用于调用函数模板特化
template<class X> void f(X a);
template<class X> void f(X* a);
int* p;
f(p);
  1. address of a function template specialization被占用时
template<class X> void f(X a);
template<class X> void f(X* a);
void (*p)(int*) = &f;
  1. 选择placement operator delete这是一个函数模板专业化,以匹配放置操作员New Li>
  2. friend function declarationexplicit instantiation 或显式特化指的是函数模板特化时
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

【讨论】:

  • 从技术上讲,这并没有超载。类模板部分特化的工作方式不同。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多