繁体   English   中英

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

[英]Pass member OR non-member function pointers as parameters

我有一个名为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方法,却支持非成员和成员函数?

使用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));

使用C ++ 11或boost,您的任务很容易-但是因为您想要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 <functional> C ++ 03 std::mem_fun/bind1st

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

发布c ++ 11,以及其他答案

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM