我想创建一个函数对象,它允许我绑定一个参数少于函数对象的函数。
例如:
int SomeFunction(int i) { return i * i; }
Function<int, int, float> function(&SomeFunction);
调用function(5, 3.14f);
会将5
作为参数调用该函数,而3.14f
将被忽略。
目标是在标准C ++中创建类似于Qt信号和插槽机制的东西。
我可以使用什么样的模板魔术来实现这一目标?
答案 0 :(得分:1)
您可以使用std::tuple
和std::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;
};