【问题标题】:Templated functions overload return type模板化函数重载返回类型
【发布时间】:2015-07-01 19:07:50
【问题描述】:

以下看起来不像是部分特化(但是不能在模板化函数上发生)。 Plus 函数不会仅通过返回类型来重载。下面的代码是怎么回事??

#include <iostream>
#include <string>
#include <vector>

template<typename T>
T foo() {
 std::cout << "first";
 return T();   
}


template<typename T, typename U>
std::pair<T,U> foo() {
 std::cout << "second";
 return std::make_pair<T,U>(T(),U()); 
}

int main()
{
    foo<int>();
    foo<int,char>();
}

【问题讨论】:

  • 你有两个不同的模板,一个有一个参数,另一个有两个(没有foo重载)。

标签: c++


【解决方案1】:

您有两个 foo 重载(实际上是两个名为 foo 的函数模板)。一个接受一个模板类型参数:

template<typename T>
T foo();

一个接受两个模板类型参数:

template<typename T, typename U>
std::pair<T,U> foo();

您可以重载不同的模板参数。您甚至可以添加采用非类型参数的重载:

template <int I>
void foo() {
    std::cout << "third";
}

这也是一个单独的、有效的重载。然后你不能做的是单独添加:

template <typename U>
U* foo();

因为现在您有两个名为 foo 的不同函数模板,它们接受一个模板参数,并且编译器无法知道您的意思是哪一个 - 所以现在您有一个保证的模棱两可的重载。

【讨论】:

  • 嗯,那stackoverflow.com/questions/2174300/… 呢?为什么允许 1 和 3?
  • @Albert 1 采用 Xint,3 采用 XYZ。没有歧义。
  • 呃,甚至这也属于“非部分专业化”的东西? coliru.stacked-crooked.com/a/8ac30701c6ec6d0e(最后一个问题来澄清一切)
  • @Albert 这里与专业化无关。在该示例中,一个函数采用具有一个类型参数的模板模板类,而另一个函数采用具有两个类型参数的模板模板类。它们不是彼此的专长。
【解决方案2】:

我不会称之为重载,但是编译器会根据模板参数生成两个不同的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    相关资源
    最近更新 更多