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> ¶ms) {
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)
.
的函数类型
我正在尝试获取 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> ¶ms) {
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)
.