将继承的方法传递给另一个方法

时间:2015-11-12 13:36:14

标签: c++ inheritance methods

我正在尝试使用方法作为参数构建一个具有成员函数的类。这些方法在继承的类中定义。我构建了一个最小的例子:

#include <iostream>

struct base
{
    base() {}

    int number(int (*f)(int))
    {
        return f(1);
    }
};

struct option1 : base 
{
    int timesTwo(int i){return 2*i;}
    option1() 
    {
        std::cout << number(timesTwo);
    }
};

struct option2 : base
{
    int timesThree(int i){return 3*i;}
    int timesFour (int i){return 4*i;}
    option2() 
    {
        std::cout << number(timesThree);
    }
};

int main()
{
    option1 a; //I would expect this to print "2"
}

函数number中的当前语法是针对一般函数的,但我不能让它适用于任何继承类的方法。

2 个答案:

答案 0 :(得分:5)

这里的问题是你传递一个指向成员函数的指针,这与指向非成员函数的指针完全不同(这是你的number函数以此为参数。

您可以使用std::functionstd::bind

int number(std::function<int(int)> f)
{
    return f(1);
}

...

number(std::bind(&option1::timesTwo, this, _1));

你也可以使用模板和额外的参数,比如

template<typename T>
int number(T* object, int(T::*f)(int))
{
    return (object->*f)(1);
}

...

number(this, &option1::timesTwo);

或简单(但并不总是正确,取决于情况和用例):制作回调函数static

static int timesTwo(int i){return 2*i;}

我的建议是你使用std::function来查看解决方案,因为这样可以很容易地用任何类型的可调用对象调用number函数,比如lambda:

number([](int x){ return x * 2; });

答案 1 :(得分:4)

给出的错误说:

  

错误:必须调用对非静态成员函数的引用

您只需在方法成员之前添加static即可。

我建议您使用std::function代替指针功能。

工作代码:

#include <iostream>
#include <functional>

struct base
{
    base() {}

    int number(std::function<int(int)> f)
    {
        return f(1);
    }
};

struct option1 : base 
{
    static int timesTwo(int i){return 2*i;}
    option1() 
    {
        std::cout << number(timesTwo);
    }
};

struct option2 : base
{
    static int timesThree(int i){return 3*i;}
    static int timesFour (int i){return 4*i;}
    option2() 
    {
        std::cout << number(timesThree); 
    }
};

int main()
{
    option1 a; // now it works
}