繁体   English   中英

在解引用的类中解引用指向函子的指针

[英]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;
}

http://ideone.com/K3QRRV

y = (*RefToBar->my_ftor)(25);

(最好使用std :: function并且不要违反demeter)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM