我正在尝试编写一个接受带有任何非零参数的函数的程序,并使用std :: bind将其减少到只接受一个参数的函数。
问题的后半部分很好,但我希望用户能够输入任何类型的函数 - std :: function,函数指针,functor或lambda - 我不知道如何编写模板参数这将接受最后两种类型,并允许我推断该函数所采用的参数数量。
请在下面的示例代码中找到' foo'重载的函数接受函数指针和std :: functions - 如果有人能指出我正确的方向如何编写其他两个重载我将非常感激。
#include <functional>
#include <iostream>
template <typename Ret, typename ParamA, typename... Params>
unsigned int foo(const std::function<Ret(ParamA, Params...)>& f)
{
return sizeof...(Params);
}
template <typename Ret, typename ParamA, typename... Params>
unsigned int foo(Ret(*f)(ParamA, Params...))
{
return sizeof...(Params);
}
unsigned int foo(/*accepts a functor*/);
unsigned int foo(/*accepts a lambda*/);
std::function<void(int)> std_func([](int) {});
void f_ptr(int, int) {}
struct functor { void operator () (int, int, int) {} };
auto lambda = [](int, int, int, int) {};
int main()
{
std::cout << foo(std_func); //Passed in a std::function
std::cout << foo(f_ptr); //Passed in a function pointer
std::cout << foo(functor()); //Passed in a functor
std::cout << foo(lambda); //Passed in a lambda
return 0;
}
答案 0 :(得分:0)
这样的事情:
// Accepts a pointer to member function
template <typename T, typename Ret, typename ParamA, typename... Params>
unsigned int foo(Ret (T::*f)(ParamA, Params...))
{
return sizeof...(Params);
}
// Accepts a pointer to const member function
template <typename T, typename Ret, typename ParamA, typename... Params>
unsigned int foo(Ret (T::*f)(ParamA, Params...) const)
{
return sizeof...(Params);
}
// Accepts a function object, including lambda and std::function
template <typename F>
unsigned int foo(const F& func) {
return foo(&F::operator());
}
仅适用于具有一个非重载operator()
的函数对象。由于std::function
也是这样的对象,因此不再需要std::function
的专用重载(但仍需要一个普通函数指针)。