如何解压缩c ++ 11中包装函数参数的元组?

时间:2015-12-02 17:22:54

标签: c++ c++11 tuples

//function wapper
template<class F,typename...Args>
class FuncWrapper
{
private:
    //F return type
    using return_type = typename std::result_of<F(Args...)>::type;

    template<int ...S> struct IndexSeq {};
    template<int N, int ...S> struct makeSeq : makeSeq<N - 1, N - 1, S...> {};
    template<int ...S> struct makeSeq<0, S...> : IndexSeq<S...> {};


public:
    FuncWrapper(F &&func,Args&&...args):
        f(std::move(std::function<return_type(Args...)>(std::forward<F>(func)))),
        para(std::make_tuple<Args...>(std::forward<Args>(args)...))
    {}
    ~FuncWrapper() = default;

    template <int... INDEX>
    return_type delay_action(makeSeq<INDEX...>)
    {
        return f(std::get<INDEX>(para)...);
    }

    //
    return_type operator()()
    {
        return  delay_action(makeSeq<sizeof...(Args)>{});
    }

private:
    //function
    std::function<return_type(Args...)> f;
    //parameter in the tuple
    std::tuple<Args...> para;
};

template<class F,typename ...Args>
FuncWrapper<F,Args...> make_function_wapper(F &&f, Args&&...args)
{
    return FuncWrapper<F, Args...>(std::forward<F>(f), std::forward<Args>(args)...);
}

这里是一个问题:我想为包装函数创建一个模板类,并使用元组作为参数存储,但似乎它不能很好地工作,我找不到原因。     所以我需要一些帮助,谁可以解释它。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

以下代码:

template <int... INDEX>
return_type delay_action(makeSeq<INDEX...>)
{
    return f(std::get<INDEX>(para)...);
}

应该是:

template <int... INDEX>
return_type delay_action(IndexSeq<INDEX...>)
//                       ~~~~~~~^
{
    return f(std::get<INDEX>(para)...);
}

您使用的序列生成器背后的想法是,派生最多的makeSeq<2>类最终继承自IndexSeq<0, 1>,您想要推导的是来自{{1}的一系列数字},而不是来自IndexSeq本身的序列的长度。

您还应该注意makeSeq中的Args可以是(可能是cv限定的)左值引用类型,因此要将参数安全地存储在元组中,元组声明应如下所示:

FuncWrapper