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

问题描述 投票:0回答:1

我经常发现自己在处理模板和模板中函数的返回值。而我总是以这样的方式结束。

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

虽然这很好用,但很丑陋,而且从外观上看不出来我想要什么。有没有一种更易读、不那么 "黑 "的方法来获取 "在模板参数上调用该方法的返回类型"?

templates c++11 decltype
1个回答
1
投票

没有别名模板 :

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

有别名模板( 或手写)。)

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

使用 std::invoke_result_t.

© www.soinside.com 2019 - 2024. All rights reserved.