簡體   English   中英

C ++函數模板:派生和顯式返回類型

[英]C++ function template: Derived and explicit return type

我有以下問題,我只是沒有看到一個正確的解決方案(也許沒有):我有一個模板化的方法,其中返回類型依賴於輸入類型,並感謝C ++ 11 decltype返回type可以很容易地派生, 我還想允許用戶在需要時明確定義返回類型。

更正式地說,我有一個模板化函數f ,我希望可以調用f(x) ,既沒有顯式定義輸入也沒有返回類型。 我還希望能夠將其稱為f<ret_t>x() ,並且顯式定義了返回類型,但輸入類型仍然是自動派生的。

現在,用C ++ 11滿足第一個約束是很容易的(讓我們假設還有另一個模板化的方法:

template<typename InT>
auto f(const InT& in) -> decltype(/* code deriving the return type using in */);

但是這不會允許覆蓋返回類型,因為我必須將其添加為第二個模板參數並將decltype派生移動到模板定義中,並且可能需要使用std::declval<InT>std::result_of

template<
    typename InT,
    typename RetT = /* code deriving return type using InT and declval/result_of */>
RetT f(const InT& in);

但是,這樣我總是需要在調用f時明確定義InT 因此聲明f為了能夠離開InT開放,但指定RetT應該是:

template<
    typename RetT = /* code deriving return type using InT and declval/result_of */,
    typename InT>
RetT f(const InT& in);

但是,因為在那里我需要指定一個默認值的點RetTInT尚未公布,因此無法使用。

到目前為止我能想出的最好的解決方法,這不是很令人滿意,而且似乎無論如何都不起作用,因為RetT演繹失敗(顯然是因為你不能從默認參數中推斷出類型),是:

template<typename RetT, typename InT>
RetT f(
    const InT& in,
    const RetT& = std::declval</* code deriving return type using InT or in and declval/result_of */>());

是否有更好的方法來對默認值RetT是依賴於InT ,同時仍然能夠顯式地指定RetT如果需要的話? 重要的是要注意返回類型需要在函數實現中可用,以便RetT的對象直接分配,並且只在方法體內分配一次。

您可以使用std::conditionaldummy類型來檢查函數是否具有自動推導類型或用戶選擇類型。

如果用戶明確選擇了返回類型,則返回類型將與dummy類型不同,這將是函數的返回類型。 否則只需像以前一樣使用推導類型。

以下是一個使用示例:

#include <typeindex>
#include <type_traits>
#include <iostream>

struct dummy
{
};

template<typename RetType = dummy, typename T>
auto f(const T& in)
-> typename std::conditional<std::is_same<RetType, dummy>::value, T, RetType>::type
{
    std::cout<<typeid(RetType).name()<<" "<<typeid(T).name()<<std::endl;
    return in;
}

int main()
{
    f(1);
    f<float>(1);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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