C++ 函数模板重载(不同的返回值类型)
我正在阅读,在“13.7函数模板的部分专门化”中,作者说: 要重载函数模板,它们的函数参数必须在某些实质性方面有所不同。考虑函数模板R转换(T const &),其中R和T是模板参数。我们可能非常希望将此模板专门化为R=void,但这不能使用重载来完成 可以使用函数模板重载来完成,对吗?例如:C++ 函数模板重载(不同的返回值类型),c++,templates,C++,Templates,我正在阅读,在“13.7函数模板的部分专门化”中,作者说: 要重载函数模板,它们的函数参数必须在某些实质性方面有所不同。考虑函数模板R转换(T const &),其中R和T是模板参数。我们可能非常希望将此模板专门化为R=void,但这不能使用重载来完成 可以使用函数模板重载来完成,对吗?例如: #include <iostream> template <typename T, typename R> R convert(T const&) { std:: cou
#include <iostream>
template <typename T, typename R>
R convert(T const&) { std:: cout << "R convert(T const&)\n"; }
template <typename T>
void convert(T const&) { std:: cout << "void convert(T const&)\n"; }
int main()
{
convert(0);
}
#包括
模板
R convert(T const&){std::cout考虑类模板的部分专门化:
template<class U, class V> class T { };
template<class V> class T<void, V> { };
如果你写了convert(something)
——这以前是格式不正确的,它会转到你的新重载,因为编译器无法推导出第一个模板的R
。但是如果你写了convert(something)
甚至convert(something)
,它仍然会转到原始模板。更糟糕的是,类似于convert(1)
的内容现在格式不正确,因为它不明确
换句话说,您不能让convert(something)
使用与convert(something)不同的实现
,而您可以使用类模板部分专门化来实现这一点。作者可能是指C++不支持在返回类型上重载。@nix但函数模板重载支持它。我认为您遇到了一些UB,您的编译器没有足够的智能来警告它。请尝试添加一个返回状态我nt到第一个convert
(这样它将编译),然后将对convert(0)`的调用替换为int i=convert(0)
。它不会编译。编译器无法推断第一个模板的R
,因此它从未被选中。@nix因为作者正在讨论“部分专门化”和“超载"但是我认为这不能通过专业化来完成。所以我不能从书中得到上述上下文的观点。我认为作者建议函数模板的部分专门化可以做到这一点……我的误解。@宋元耀,C++中没有函数模板的部分专门化,周期。作者似乎是B。e讨论了一些可以通过对标准进行假设性修改以允许函数模板部分专门化来解决的情况,但标准从未以这种方式更改。
template <typename R, typename T>
R convert(T const&) { return /* something */; }
template <typename T>
void convert(T const&) { }