[英]Determining return type of “generic function”
假設,我想開發一個通用庫,它應該可以用於類似數字的類型,包括雙重和用戶定義的類型。 我現在面臨的問題是,我不知道如何編寫函數模板的返回類型,就像這樣:
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
using聲明使這個函數模板的主體適用於原始類型,因為它們沒有關聯的命名空間(因此沒有ADL)。 但是我希望transmogrify使用專門的abs函數,以防用戶定義類型的作者提供自己的abs函數。 我不能簡單地使用
-> decltype( abs(x)+2.0 )
因為這不適用於比賽,因為std :: abs不在范圍內(據我所知)。 但寫作
-> decltype( std::abs(x)+2.0 )
會禁用ADL。 但禁用ADL不是一種選擇。 此外,專用abs函數返回的值可能不是T類型,而是某些其他類型。
關於如何解決返回類型問題的任何想法,同時(a)保持ADL和(b)回退到某些默認函數(如本例中的std :: abs),對於不提供專用abs的類型。
使用單獨的命名空間,您可以在其中放置using子句。 這可以防止命名空間污染,因為using子句僅適用於該命名空間。 我建議將它命名為獨特的東西,這樣你就不會意外地將它傳播開來。
namespace transmog_detail
{
using std::abs;
template<class T>
auto transmogrify(T x) -> decltype(abs(x) + 2.0)
{
return abs(x) + 2.0;
}
}
// Then pull it into the current namespace, as recommended by @LucDanton.
using transmog_detail::transmogrify;
// Or if there is a reason, you can forward.
// template<class T>
// auto transmogrify(T x)
// -> decltype(transmog_detail::transmogrify(x))
// {
// return transmog_detail::transmogrify(x);
// }
上面的答案很好,但我能想到的最簡單的方法是使用typeinfo標題。 它專門用於確定對象的類型和構造函數。
見這里: http : //www.cplusplus.com/reference/std/typeinfo/type_info/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.