具有未知返回类型的Std函数

时间:2017-01-30 14:50:57

标签: c++ std-function

我试图在不直接知道返回类型的情况下声明std函数。

显然,它会在编译时知道,但我找不到正确的方式来声明它。

最重要的是,我需要创建一个包含此函数返回值的容器。

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;

};

有什么想法吗?

2 个答案:

答案 0 :(得分:10)

你也不知道函数参数,并用模板参数解决了这个问题(好吧,参数包,因为零或更多)。

为返回类型做同样的事情!

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

答案 1 :(得分:1)

您可以在模板参数中接受可调用类型,而不是参数列表。这将允许您发送任何函数或函数对象并检查返回类型:

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

为了简化该类的构建,你可以引入一个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)...};
}