我有这样的函子
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);
不能工作,可悲的是...
任何想法?谢谢
使用真实参考:
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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句