簡體   English   中英

函數模板重載(不同的返回值類型)

[英]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 */; } 

請注意, RT的順序在上面的模板參數列表中交換。 這可能是這樣一個模板的編寫方式 - 你編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM