C++ 模板 result_of_t 在尝试查找函数的 return 值时没有名为 'type' 的类型

C++ template result_of_t no type named 'type' when trying to find return value of function

我正在尝试获取 return 类型的函数模板。我看到的一种解决方案使用 result_of_t:

#include <iostream>
#include <vector>
#include <string>
#include <type_traits>
#include <map>
#include <unordered_map>
#include <any>
using namespace std;

using MapAny = map<string, any>;

template <typename num_t>
num_t func1_internal(const vector<num_t> &x, int multiplier) {
    num_t res = 0;
    for (int i=0; i<x.size(); i++)
        res += multiplier * x[i];
    return res;
}
template <typename num_t>
class Func1 {
using ResultType = num_t; // std::result_of_t<decltype(func1_internal<num_t>)>;
//using ResultType = std::result_of_t<decltype(func1_internal(const vector<num_t>&, int))>;
private:
    vector<int> multipliers;

public:
    Func1(const vector<MapAny> &params) {
        for (const auto& param : params) {
            multipliers.push_back(any_cast<int>(param.at("multiplier")));
        }
    }

    any operator()(const vector<double> &x) {
        vector<ResultType> res;
        for (int multiplier : multipliers)
            res.push_back(func1_internal(x, multiplier));
        return res;
    }
};

int main()
{
    Func1<float> func1({});
    return 0;
}

然而,它给我一个错误:

/usr/include/c++/10/type_traits: In substitution of ‘template<class _Tp> using result_of_t = typename std::result_of::type [with _Tp = float(const std::vector<float, std::allocator<float> >&, int)]’:
fobject.cpp:21:7:   required from ‘class Func1<float>’
fobject.cpp:45:23:   required from here
/usr/include/c++/10/type_traits:2570:11: error: no type named ‘type’ in ‘class std::result_of<float(const std::vector<float, std::allocator<float> >&, int)>’
 2570 |     using result_of_t = typename result_of<_Tp>::type;

在 C++20 中执行此操作的正确方法是什么?另外,我听说 std::result_of 已被弃用,所以我正在寻找可能的最佳方法。

您可以使用 C++17 std::invoke_result,其中第一个参数是可调用类型,后面是参数类型

using ResultType = invoke_result_t<
  decltype(func1_internal<num_t>), const vector<num_t>&, int>;

decltype(func1_internal<num_t>) 将得到 int(const std::vector<int>&, int).

的函数类型