我正在尝试使用方法作为参数构建一个具有成员函数的类。这些方法在继承的类中定义。我构建了一个最小的例子:
#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
中的当前语法是针对一般函数的,但我不能让它适用于任何继承类的方法。
答案 0 :(得分:5)
这里的问题是你传递一个指向成员函数的指针,这与指向非成员函数的指针完全不同(这是你的number
函数以此为参数。
您可以使用std::function
和std::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
}