C ++非静态函数作为变量

时间:2014-01-05 02:35:09

标签: c++

   class manip{
public:
    int t;
    manip(int tom){
        t = tom;
    }
    int sub(int val){
        return t - val;
    }
    int add(int val){
        return t + val;
    }
    int perform(int(manip::*key)(int), int val){
        return (this->*key)(val);
    }
};

int main() {
    manip g(5);
    cout << g.perform(&manip::add, 9) << ":" << g.perform(&manip::sub, 9);

(这只是我试图在更大的代码中解决的问题的简化版本)

问题出在这里

    int(b::*func)(int) = b::add;

    int c = func(2);

这给了我第二行的语法错误(因为我没有引用“this”数据)。我如何更改它,以便被调用的函数不是b :: add而是inst.add。

编辑:发布了代码的工作版本。谢谢Speed8ump

3 个答案:

答案 0 :(得分:2)

在你的例子中'func'是一个成员函数指针。必须使用 on 它所属的数据类型的实例:

int c = (inst.*func)(2);

答案 1 :(得分:1)

您需要提供指向struct(或aA)的参数。

int main(){
    b inst(5)
    int(b::*func)(int, struct b*) = b::add;
    int c = func(2, &inst);
}

int add(int a, struct b* ptr){
    return a + ptr->aA;
}

答案 2 :(得分:1)

如果您的编译器足够新,您可以避免使用函数指针并使用std :: function代替

 int(b::*func)(int) = b::add;

变为

#include <functional>
#include <iostream>
 class manip{
public:
    int t;
    manip(int tom){
        t = tom;
    }
    int sub(int val){
        return t - val;
    }
    int add(int val){
        return t + val;
    }
    int perform(std::function<int(manip*,int)>f, int val){
        return f(this, val);
    }
};

int main() {
    manip g(5);
    std::cout << g.perform(&manip::add, 9) << ":" << g.perform(&manip::sub, 9);
}