我有以下课程:
class conditionStack : public Stack
{
public:
bool even(int);
bool odd(int);
bool positive(int);
void push(bool(*)(int), int);
};
推送功能:
void conditionStack::push(bool (*p)(int), int a)
{
if (p(a))
Stack::push(a);
}
我按照以下方式在main.cpp中调用函数
conditionStack Even;
Even.push(Even.even, value);
但结果是出现以下错误
error C3867: 'conditionStack::even': function call missing argument list; use '&conditionStack::even' to create a pointer to member
我试着将其称为Even.push(&conditionStack::even, value);
但它不起作用:(你能帮助我吗?
答案 0 :(得分:0)
一个C ++成员函数接受一个不可见的额外参数(this),它使得指向它的指针比上面有点棘手。
处理它们的稍微老一点的方法是“mem_fun”
使其更友好的提升方式是“boost :: bind”
处理它们的稍微现代的方法是“C ++ lambda”
但是,我只想说成员函数的类型可能是:
bool (*) (conditionStack *, int)
我敢打赌如果你真的非常想要你可以做到这一点,但正如评论所暗示的那样,请不要。这不是标准,不保证,也不可读!
或者,您可以尝试将它们全部设为静态成员函数(静态函数不接受此参数)。
评论说我缺乏例子。这是真的。一个例子可能已经变得非常庞大和复杂,而且问题还不够明确,无法证明它(还)。这里有一个存储lambdas向量的例子:Why can't I create a vector of lambda in C++11?
答案 1 :(得分:0)
也包含有关对象实例的信息的函数指针称为委托,并且在C ++中很长时间没有标准功能。
从C ++ 11开始,有std :: function。
你应该看看它:
http://en.cppreference.com/w/cpp/utility/functional/function
其中一个例子展示了你想要的东西:
// store a call to a member function
std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
const Foo foo(314159);
f_add_display(foo, 1);