传递成员或非成员函数指针作为参数

时间:2014-10-03 10:13:12

标签: c++ member-function-pointers non-member-functions

我有一个名为Foo的结构,它包含一个调用传递方法的函数并返回值。

struct Foo
{
    unsigned char fooFunc(unsigned char param, unsigned char(getValueMethod)(const unsigned char))
    {
        return getValueMethod(param);
    }
};

我有一个名为barFunc的方法......

static unsigned char barFunc(const unsigned char paramA)
{
    return paramA * 2;
}

...可以很好地传递给fooFunc

Foo foo1;
foo1.fooFunc(10, &barFunc);

但我也希望fooFunc接受成员函数,比如bazFunc ....

struct Baz
{
    unsigned char bazFunc(const unsigned char paramB)
    {
        return paramB * 3;
    }
};

......像这样被召唤......

Foo foo2;
Baz baz;
foo2.fooFunc(10, ?????);

......但这无效。

我在传递成员函数作为参数的主题上找到的所有内容都谈到了在调用对象之前知道对象来自哪个类,这意味着我必须创建2个函数而不是一个函数。

有没有找到的方法,只需要1个fooFunc方法,但是会支持非成员函数和成员函数吗?

3 个答案:

答案 0 :(得分:3)

boost::function<signature>传递给boost::bind()

的结果
bool free_func(std::string const& arg) { ... }

struct X {
    bool mem_func(std::string const& arg) { ... }
};

...
typedef boost::function<bool (std::string const& name)> func_t;

std::vector<func_t> funcs;
X x;

funcs.push_back(boost::bind(&X::mem_func, x, _1));
funcs.push_back(boost::bind(&free_func, _1));

答案 1 :(得分:1)

使用C ++ 11或者提升你的任务很简单 - 但是因为你想拥有C ++ 03解决方案,那么正如评论中所建议的那样 - 使用模板成员函数:

struct Foo
{
    template <typename Function>
    unsigned char fooFunc(unsigned char param, Function getValueMethod)
    {
        return getValueMethod(param);
    }
};

然后使用自由功能示例,您将不会更改任何内容:

Foo foo1;
foo1.fooFunc(10, &barFunc);

使用成员函数 - 只需使用C ++ 03 std::mem_fun/bind1st中的C ++ 03 <functional>

#include <functional>
Foo foo2;
Baz baz;
foo2.fooFunc(10, std::bind1st(std::mem_fun(&Baz::bazFunc), &baz));

答案 2 :(得分:1)

发布c ++ 11,按照其他答案

pre c ++ 11:

#include <iostream>
#include <functional>


using namespace std;

struct foo_holder {

    template<class T>
    unsigned char foo(unsigned char v, T f) {
        return f(v);
    }

};

unsigned char bar(unsigned char param) {
    return param * 2;
}

struct baz {
    unsigned char bar(unsigned char param) {
        return param * 3;
    }
};

int main()
{
   cout << "Hello World" << endl; 

   foo_holder f;
   baz b;

   cout << static_cast<int>(
    f.foo(6, bar)
    ) << endl;

   cout << static_cast<int>(
    f.foo(6, std::bind1st(std::mem_fun(&baz::bar), &b))
    ) << endl;

   return 0;
}