簡體   English   中英

確定“通用函數”的返回類型

[英]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.

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