2014-10-16 136 views
0

我經常發現自己正在處理模板並在所述模板中返回函數的值。我總是最終的東西是這樣的:模板參數類返回的函數調用類型

template<typename Data> 
auto foo(const Data& d) -> 
    typename std::decay<decltype(reinterpret_cast<const Data*>(0)->operator()(0, 0))>::type 
{ 
    typedef typename std::decay<decltype(reinterpret_cast<const Data*>(0)->operator()(0, 0))>::type return_t; 
    ... 
} 

雖然這個工作,它是醜陋的,而不是真的很明顯是我從快速查找想要的。是否有更可讀,更少的'hackish'方法來獲得「在模板參數上調用此方法的返回類型」?

+0

你確定要衰減類型,還是可以與'operator()'聲明的相同? – 2014-10-16 10:58:55

+0

在這種情況下,我想腐爛它。即使'operator()'返回一個'const T'我想返回一個'T',因爲我在這個特定情況下通過插值創建了新的值。 – 2014-10-16 11:00:09

+0

可以將'Data'作爲一個函數,或者它必須與'operator()'類一起使用? – 2014-10-16 11:06:12

回答

1

無模板的別名(C++ 11):

template <typename Data> 
auto foo(const Data& d) -> typename std::decay<decltype(d(0, 0))>::type 
{ 
    return {}; 
} 

或:

template <typename Data 
     , typename return_r = typename std::decay< 
       typename std::result_of<const Data(int, int)>::type 
      >::type> 
return_r foo(const Data& d) 
{ 
    return {}; 
} 

隨着模板別名(C++ 14或手寫):

template <typename Data> 
auto foo(const Data& d) -> std::decay_t<decltype(d(0, 0))> 
{ 
    return {}; 
} 

或者:

template <typename Data 
     , typename return_r = std::decay_t<std::result_of_t<const Data(int, int)>>> 
return_r foo(const Data& d) 
{ 
    return {}; 
} 
+0

第一個例子完美的作品。然而,第二個因爲某些'Data'將操作符指定爲operator()(unsigned int,unsigned int)而導致麻煩,則匹配失敗。 *呃*但是第一種方法可以更好地加載:D – 2014-10-16 13:49:12

相關問題