参数接收的对象上的函数指针

时间:2014-01-20 18:48:24

标签: c++ function-pointers

我有一个接收对象实例和函数指针的函数。如何在对象实例上执行函数指针?

我试过了:

void    Myclass::my_fn(Object obj, bool (*fn)(std::string str))
{
   obj.fn("test"); // and (obj.fn("test"))
}

但没有任何作用。它告诉我“未使用的参数my_fn和fn”

2 个答案:

答案 0 :(得分:4)

这是因为fn不是Object成员函数指针。为此,你必须这样做。

bool (Object::*fn)(std::string)

然后打电话给你,你必须做

(obj.*fn)(...);

但是,如果您的编译器和库可以支持C ++ 11,我建议您使用std::functionstd::bind

void MyclasS::my_fn(std::function<bool(std::string)> fn)
{
    fn("string");
}

然后将my_fn函数调用为

using namespace std::placeholders;  // For `_1` below

Object obj;
myclassobject.my_fn(std::bind(&Object::aFunction, &obj, _1));

使用std::function,您还可以使用其他函数指针或lambdas:

myclassobject.my_fn([](std::string s){ std::cout << s << '\n'; return true; });

答案 1 :(得分:0)

函数指针与成员函数指针(指向方法的指针)完全不同。

如果是函数指针,则不需要任何对象来调用它们:

void    Myclass::my_fn(bool (*fn)(std::string str))
{
   fn("test");
}

在成员函数指针的情况下,正确的语法将是:

void    Myclass::my_fn(Object obj, bool (Object::*fn)(std::string str))
{
   obj.*fn("test");
}