函数重载接受所有类型的函数

时间:2017-02-25 01:20:30

标签: c++

我正在尝试编写一个接受带有任何非零参数的函数的程序,并使用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;
}

1 个答案:

答案 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的专用重载(但仍需要一个普通函数指针)。

Demo

相关问题