[英]Dereferencing pointer to functor inside a dereferenced class
我有一个像这样的函子
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));
使用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;
}
y = (*RefToBar->my_ftor)(25);
(最好使用std :: function并且不要违反demeter)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.