使用预定义参数的C ++函数引用

时间:2013-07-03 18:54:32

标签: c++ pointers parameters reference

这可能看起来像一个新问题,但我仍然试图绕过指针;特别是,功能指针。例如,假设我有两个带有一些函数的类(下面用一些伪代码表示):

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()

如果这个问题有点令人困惑,我道歉;我尽力解释它。

2 个答案:

答案 0 :(得分:4)

我认为您需要/想要的是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();
}

这是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 Aclass B的{​​{1}}不能具有相同的返回类型。当你有一个函数指针时,你会记住它获得的类型及它给出的类型。当你有一个成员函数指针时,你还记得它所属的那个类。

因此,getFunction()的返回类型应为A::getFunctionint (A::*) ()应为B::getFunction

要调用Option1和Option2,您必须使用。*运算符(如果使用new创建A,则使用 - &gt; *运算符)。 所以它会是

int (B::*) (int, int)

因此,仅使用成员函数指针,您不能使用predefinex值。但Andy Prowl的答案很可能就是你要找的。