[英]Function template overloading (different return value type)
我正在閱讀C ++模板:完整指南 ,並在“13.7功能模板的部分專業化”作者中說:
要重載功能模板,它們的功能參數必須以某種實質方式不同。 考慮函數模板R convert(T const&),其中R和T是模板參數。 我們可能非常希望將此模板專門用於R = void,但這不能使用重載來完成。
可以使用函數模板重載來完成,對嗎? 如:
#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);
}
DEMO在這里,結果是:
void convert(T const&)
作者的真正含義是什么?
考慮一個類模板部分特化:
template<class U, class V> class T { };
template<class V> class T<void, V> { };
當您編寫T<void, int>
,將使用部分特化。
現在考慮一個函數模板:
template <typename R, typename T>
R convert(T const&) { return /* something */; }
請注意, R
和T
的順序在上面的模板參數列表中交換。 這可能是這樣一個模板的編寫方式 - 你編寫convert<R>(something)
,顯式指定目標類型,同時讓編譯器推導出源類型。
現在假設您想要convert<void>(something)
做一些不同的事情。 你不能通過重載來做到這一點:
template <typename T>
void convert(T const&) { }
如果你編寫convert(something)
- 以前是不正確的,它將轉到你的新重載,因為編譯器不能推導出第一個模板的R
但是如果你編寫convert<void>(something)
或甚至convert<void, T>(something)
,它仍會轉到原始模板。 更糟糕的是,像convert<int>(1)
這樣的東西現在形成不良,因為它含糊不清。
換句話說,你不能使convert<void, T>(something)
使用與convert<int, T>(something)
不同的實現,而你可以使用類模板部分特化來實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.