![](/img/trans.png)
[英]How to pass in a C++ function pointer (of non-static member function) to a pre-defined C Function?
[英]C++ Function Referencing with Pre-defined Parameters
這似乎是個新手問題,但我仍在努力將指針放在頭上。 特別是功能的指針。 例如,假設我有兩個具有某些功能的類(下面以一些psuedocode表示):
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
的mainFunction()
的“引用”(不知道這是否是正確的術語),該對象的預定義參數為5和6。
有點難以解釋,但是最后我希望能夠瀏覽一列類(用戶將選擇某個選項,每個選項都與特定類的功能相關)。 每個類都具有一個getFunction()
,該函數返回該類具有的函數的“引用”以及一些預定義的參數。 然后,以某種方式,當用戶選擇相應的選項時,我希望能夠執行該引用的函數。
另外一個示例可能會有所幫助:
ClassA A;
int ChosenOption;
unknownReturnType Option1 = A.getFunction(10);
unknownReturnType Option2 = A.getFunction(15);
cout << "Select option 1 or 2" << endl;
cin >> ChosenOption;
if(ChosenOption == 1) Execute Option1;
else Execute Option2;
如果這個問題有點令人困惑,我深表歉意。 我已經盡力解釋了。
我認為您需要/想要的是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();
}
這是一個生動的例子 。
還要注意,在C ++ 11中,您可以使用lambda代替boost::bind()
:
class ClassA {// ...
std::function<void()> getFunction()
{
return [&] { return mainFunction(); };
}
};
class ClassB
{
// ...
std::function<int()> getFunction(int a, int b)
{
return [&] { return mainFunction(a, b); };
}
};
這是一個生動的例子 。
class A
和class B
的getFunction()
不能具有相同的返回類型。 當您有一個函數指針時,您會記住它得到的類型和它給出的類型。 當您具有成員函數指針時,您還要記住它所屬的witch類。
因此, A::getFunction
的返回類型應為int (A::*) ()
而B::getFunction
的返回類型應為int (B::*) (int, int)
。
要調用Option1和Option2,必須使用。*運算符(如果使用new創建A,則必須使用-> *運算符)。 原來如此
int (A::*Option1)() = A.getFunction(10);
//...
a.*Option1();
因此,僅使用成員函數指針,就無法使用predefinex值。 但是Andy Prowl的答案可能正是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.