2014-10-16 239 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

相关问题