在解除引用的类中取消引用指向仿函数的指针

时间:2013-12-18 10:40:00

标签: c++ oop pointers functor

我有这样的仿函数

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);
遗憾的是,

无法运作......

有什么想法吗?谢谢

3 个答案:

答案 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;
}

http://ideone.com/K3QRRV

答案 2 :(得分:0)

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

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