返回模板参数类的函数调用类型

时间:2014-10-16 10:42:19

标签: templates c++11 decltype

我经常发现自己处理模板并返回所述模板中的函数值。我总是最终得到这样的东西:

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;
    ...
}

虽然这很有效,但它看起来很丑陋而且不是很明显。是否有更可读,更少&#39; hackish&#39;获取&#34;在模板参数上调用此方法的返回类型&#34; ?

1 个答案:

答案 0 :(得分: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 {};
}