C++17 使用 Class 模板参数推导指导保存函数的 return 值的类型
C++17 Using Class Template Argument Deduction guides on a type that holds a function's return value
我设计了一个对象,它接受一个函数及其参数,并将该函数的 return 值保存在对象中以供稍后检索。
我的目标是为这个对象创建一个推导指南,允许我在对象的构造函数中省略 return 类型的函数。
#include <utility>
template <typename Ret> class footure {
public:
template <typename Function, typename... Args>
explicit footure(Function &&fun, Args &&... args) {
// ...
value_ = fun(std::forward<Args>(args)...);
// ...
}
Ret get() { return value_; }
private:
Ret value_;
};
int add(const int a, const int b) { return a + b; }
int main() {
auto f = footure<int>(add, 2, 3); // Remove <int>
auto r = f.get();
}
我查阅了 this PR 等资源来尝试解决这个问题,但我无法想出解决方案。
您似乎在寻找 std::invoke_result
。
template <typename Function, typename... Args>
explicit footure(Function&&, Args&&...) -> footure<std::invoke_result_t<Function&&, Args&&...>>;
别忘了添加 header <type_traits>
.
class 必须在编译时知道 Function
和 Args
。只有这样你才能推断出 _value
的类型:
#include <utility>
#include <type_traits>
template <typename Function, typename... Args> class footure {
public:
explicit footure(Function &&fun, Args &&... args) {
// ...
value_ = fun(std::forward<Args>(args)...);
// ...
}
auto get() { return value_; }
private:
typename std::result_of<Function&(Args...)>::type value_;
};
int add(int a, int b) { return a +b; }
int main() {
auto f = footure(add, 1, 2); // Remove <int>
auto r = f.get();
}
我设计了一个对象,它接受一个函数及其参数,并将该函数的 return 值保存在对象中以供稍后检索。
我的目标是为这个对象创建一个推导指南,允许我在对象的构造函数中省略 return 类型的函数。
#include <utility>
template <typename Ret> class footure {
public:
template <typename Function, typename... Args>
explicit footure(Function &&fun, Args &&... args) {
// ...
value_ = fun(std::forward<Args>(args)...);
// ...
}
Ret get() { return value_; }
private:
Ret value_;
};
int add(const int a, const int b) { return a + b; }
int main() {
auto f = footure<int>(add, 2, 3); // Remove <int>
auto r = f.get();
}
我查阅了 this PR 等资源来尝试解决这个问题,但我无法想出解决方案。
您似乎在寻找 std::invoke_result
。
template <typename Function, typename... Args>
explicit footure(Function&&, Args&&...) -> footure<std::invoke_result_t<Function&&, Args&&...>>;
别忘了添加 header <type_traits>
.
class 必须在编译时知道 Function
和 Args
。只有这样你才能推断出 _value
的类型:
#include <utility>
#include <type_traits>
template <typename Function, typename... Args> class footure {
public:
explicit footure(Function &&fun, Args &&... args) {
// ...
value_ = fun(std::forward<Args>(args)...);
// ...
}
auto get() { return value_; }
private:
typename std::result_of<Function&(Args...)>::type value_;
};
int add(int a, int b) { return a +b; }
int main() {
auto f = footure(add, 1, 2); // Remove <int>
auto r = f.get();
}