我有这样的仿函数
struct foo
{
int a;
foo(a) : a(a) {}
int operator()(int b) { return a+b; }
};
这样的课程
class bar
{
public:
foo* my_ftor;
bar(foo* my_ftor) : my_ftor(my_ftor) {}
~bar() {}
};
然后假设一个指向这个类的指针,它包含一个指向foo的指针。
foo MyFoo(20);
bar MyBar(&MyFoo);
在函数中,我将引用传递给bar,我想运行仿函数。我按照以下方式工作:
void AnyFunction(bar* RefToBar)
{
int y;
y = RefToBar->my_ftor->operator()(25);
}
还有其他“更清洁”的方法来取消引用仿函数吗?类似于
的东西y = RefToBar->my_ftor(25);
遗憾的是,无法运作......
有什么想法吗?谢谢
答案 0 :(得分:2)
使用真实参考:
class bar {
public:
foo &my_ftor;
bar (foo &f) : my_ftor(f) {}
};
void AnyFunction (bar &reftobar) {
int y = reftobar.my_ftor(25);
}
并像这样打电话
foo myFoo(20);
bar myBar (myFoo);
AnyFunction (myBar);
为了完整性,这里有另一个答案,更多的是现代方法。
class foo {
public:
foo (int i) : a(i) {}
int operator() (int x) const {
return x + a;
}
private:
int a;
};
template <typename F>
void AnyFunction (const F &func) {
int y = func(25);
}
所以你可以直接传递foo
:
AnyFunction (foo (20));
或者另一种函数对象,比如lambda:
AnyFunction([](int x) -> int {
return x + 20;
});
您还可以扩展bar
以包含以下功能:
int run_foo (int x) const {
return my_ftor (x);
}
绑定它(#include <functional>
):
AnyFunction (std::bind (&bar::run_foo, &myBar, std::placeholders::_1));
答案 1 :(得分:1)
使用std::function
设计它们可以保存任何类型的仿函数。
#include <functional>
#include <iostream>
struct foo
{
int _a;
foo(int a) : _a(a) {}
int operator()(int b) { return _a+b; }
};
class bar
{
public:
std::function<int (int)> _ftor;
bar(std::function<int (int)> my_ftor) : _ftor(my_ftor) {}
~bar() {}
};
void AnyFunction(bar& RefToBar)
{
int y = RefToBar._ftor(25);
std::cout << "Y: " << y << std::endl;
}
int AnotherFunction(int b)
{
return b + 11;
}
int main(int argc, char const *argv[])
{
foo MyFoo(20);
bar MyBar(MyFoo);
bar MyBar_2(AnotherFunction);
bar MyBar_3([](int b) { return b + 56; });
AnyFunction(MyBar);
AnyFunction(MyBar_2);
AnyFunction(MyBar_3);
return 0;
}
答案 2 :(得分:0)
y = (*RefToBar->my_ftor)(25);
(最好使用std :: function并且不要违反demeter)