这可能看起来像一个新问题,但我仍然试图绕过指针;特别是,功能指针。例如,假设我有两个带有一些函数的类(下面用一些伪代码表示):
ClassA {
void mainFunction();
unknownReturnType getFunction();
};
ClassB {
int mainFunction(int a, int b);
unknownReturnType getFunction(int a, int b);
};
现在说,在另一个类中,我想调用每个类的getFunction()
函数,并让该函数返回类mainFunction()
函数的引用和一些预定义的参数。即,说我做了以下事情:
ClassB B;
unknownReturnType B_Function = B.getFunction(5, 6);
B_Function现在应该是一个“引用”(不知道这是否是正确的术语)来对象B
的{{1}}使用预定义的参数5和6。
这有点难以解释,但最后我希望能够通过一个类列表(用户将选择一个选项,每个选项与特定类的功能相关)。每个类都有一个mainFunction()
,它返回一个类具有一些预定义参数的函数的“引用”。然后,不知何故,我希望能够在用户选择相应的选项时执行该引用的函数。
可能有所帮助的另一个例子:
getFunction()
如果这个问题有点令人困惑,我道歉;我尽力解释它。
答案 0 :(得分:4)
我认为您需要/想要的是std::function
和std::bind
(或几乎相当于boost::function
和boost::bind
,如果您买不起C ++ 11 )。首先,为了使用它们,您需要:
#include <functional>
然后,您可以像这样定义您的类(及其成员函数):
class ClassA
{
public:
void mainFunction()
{
std::cout << "ClassA::mainFunction()" << std::endl;
}
std::function<void()> getFunction()
{
return std::bind(&ClassA::mainFunction, this);
}
};
class ClassB
{
public:
int mainFunction(int a, int b)
{
return (a + b);
}
std::function<int()> getFunction(int a, int b)
{
return std::bind(&ClassB::mainFunction, this, a, b);
}
};
在main()
内,您可以这样使用它们:
int main()
{
ClassA a;
auto a_function = a.getFunction();
a_function();
ClassB b;
auto b_function = b.getFunction(5, 6);
std::cout << b_function();
}
这是live example。
另请注意,在C ++ 11中,您可以使用lambdas而不是boost::bind()
:
类ClassA { // ...
std::function<void()> getFunction()
{
return [&] { return mainFunction(); };
}
};
class ClassB
{
// ...
std::function<int()> getFunction(int a, int b)
{
return [&] { return mainFunction(a, b); };
}
};
这是live example。
答案 1 :(得分:0)
class A
和class B
的{{1}}不能具有相同的返回类型。当你有一个函数指针时,你会记住它获得的类型及它给出的类型。当你有一个成员函数指针时,你还记得它所属的那个类。
因此,getFunction()
的返回类型应为A::getFunction
,int (A::*) ()
应为B::getFunction
。
要调用Option1和Option2,您必须使用。*运算符(如果使用new创建A,则使用 - &gt; *运算符)。 所以它会是
int (B::*) (int, int)
因此,仅使用成员函数指针,您不能使用predefinex值。但Andy Prowl的答案很可能就是你要找的。 p>