以最小的开销删除多余的参数包参数

时间:2015-08-30 11:55:48

标签: c++

我想创建一个函数对象,它允许我绑定一个参数少于函数对象的函数。

例如:

int SomeFunction(int i) { return i * i; }

Function<int, int, float> function(&SomeFunction);

调用function(5, 3.14f);会将5作为参数调用该函数,而3.14f将被忽略。

目标是在标准C ++中创建类似于Qt信号和插槽机制的东西。

我可以使用什么样的模板魔术来实现这一目标?

1 个答案:

答案 0 :(得分:1)

您可以使用std::tuplestd::function

template<typename Ret, typename... Ts>
class Function{
public:
    template<typename...Us>
    Function(Ret(*f)(Us...)) : Function(std::index_sequence_for<Us...>{}, f) {}


    template <typename ... Us>
    Ret call(Us&&... args)
    {
        return mF(std::forward<Us>(args)...);
    }

private:
    template<std::size_t... Is, typename...Us>
    Function(std::index_sequence<Is...>, Ret(*f)(Us...))
    {
        mF = [f](Ts... args)
        {
            return f(std::get<Is>(std::forward_as_tuple(args...))...);
        };
    }

private:
    std::function<Ret(Ts...)> mF;
};

Live Demo