簡體   English   中英

具有預定義參數的C ++函數引用

[英]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應該是對象BmainFunction()的“引用”(不知道這是否是正確的術語),該對象的預定義參數為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::functionstd::bind (或者相當等效的boost::functionboost::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 Aclass BgetFunction()不能具有相同的返回類型。 當您有一個函數指針時,您會記住它得到的類型和它給出的類型。 當您具有成員函數指針時,您還要記住它所屬的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM