[英]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);
但是,因為在那里我需要指定一個默認值的點RetT
, InT
尚未公布,因此無法使用。
到目前為止我能想出的最好的解決方法,這不是很令人滿意,而且似乎無論如何都不起作用,因為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::conditional
和dummy
類型來檢查函數是否具有自動推導類型或用戶選擇類型。
如果用戶明確選擇了返回類型,則返回類型將與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.