具有未知 return 类型的标准函数
Std function with unknown return type
我试图在不直接知道 return 类型的情况下声明一个标准函数。
显然,它会在编译时知道,但我找不到正确的方法来声明它。
最重要的是,我需要创建一个容器,其中将包含此函数 return 中的值。
template <typename... Args>
class Sample
{
public:
Sample(Args... args, std::function</*unknown return type*/(Args...)> fnct) :
_inputBuff(std::forward_as_tuple(std::forward<Args>(args)...))
{ }
std::tuple<Args...> _inputBuff;
std::vector</*unknown return type*/> _resultBuff;
};
有什么想法吗?
你也不知道函数参数,用模板参数解决了这个问题(好吧,参数包,因为有零个或多个)。
对 return 类型做同样的事情!
template <typename ReturnType, typename... Args>
class Sample
{
public:
Sample(Args... args, std::function<ReturnType(Args...)> fnct) :
_inputBuff(std::forward_as_tuple(args...))
{ }
std::tuple<Args...> _inputBuff;
std::vector<ReturnType> _resultBuff;
};
(live demo)
您可以在模板参数中接受可调用类型,而不是参数列表。这将允许您发送任何函数或函数对象并检查 return 类型:
template<typename F, typename... Args>
struct Sample {
Sample(F fnct, Args... args) :
_inputBuff{std::forward_as_tuple(std::forward<Args>(args)...)} { }
using Result = std::result_of_t<F(Args...)>;
std::tuple<Args...> _inputBuff;
std::vector<Result> _resultBuff;
};
为了简化 class 的构造,您可以引入一个 make 函数来推导参数(注意它可以成为 C++17 中的推导指南):
template<typename F, typename... Args>
auto makeSample(F&& fnct, Args&&... args) {
return Sample<std::decay_t<F>, Args...>{std::forward<F>(f), std::forward<Args>(args)...};
}
我试图在不直接知道 return 类型的情况下声明一个标准函数。
显然,它会在编译时知道,但我找不到正确的方法来声明它。
最重要的是,我需要创建一个容器,其中将包含此函数 return 中的值。
template <typename... Args>
class Sample
{
public:
Sample(Args... args, std::function</*unknown return type*/(Args...)> fnct) :
_inputBuff(std::forward_as_tuple(std::forward<Args>(args)...))
{ }
std::tuple<Args...> _inputBuff;
std::vector</*unknown return type*/> _resultBuff;
};
有什么想法吗?
你也不知道函数参数,用模板参数解决了这个问题(好吧,参数包,因为有零个或多个)。
对 return 类型做同样的事情!
template <typename ReturnType, typename... Args>
class Sample
{
public:
Sample(Args... args, std::function<ReturnType(Args...)> fnct) :
_inputBuff(std::forward_as_tuple(args...))
{ }
std::tuple<Args...> _inputBuff;
std::vector<ReturnType> _resultBuff;
};
(live demo)
您可以在模板参数中接受可调用类型,而不是参数列表。这将允许您发送任何函数或函数对象并检查 return 类型:
template<typename F, typename... Args>
struct Sample {
Sample(F fnct, Args... args) :
_inputBuff{std::forward_as_tuple(std::forward<Args>(args)...)} { }
using Result = std::result_of_t<F(Args...)>;
std::tuple<Args...> _inputBuff;
std::vector<Result> _resultBuff;
};
为了简化 class 的构造,您可以引入一个 make 函数来推导参数(注意它可以成为 C++17 中的推导指南):
template<typename F, typename... Args>
auto makeSample(F&& fnct, Args&&... args) {
return Sample<std::decay_t<F>, Args...>{std::forward<F>(f), std::forward<Args>(args)...};
}