C ++将函数存储为变量

时间:2017-03-07 19:19:33

标签: c++ function variables abstract-class

我想知道是否有任何方法可以将函数创建为变量或动态更改类的函数。以下是一些展示我的意思的例子

爪哇

Thread t = new Thread() {
    public void run() {
        //do something
    }
}

的Javascript

var f = function() {
    //do something
}

我知道您可以使用预定义函数作为变量,但我希望在函数中完全执行此操作。

1 个答案:

答案 0 :(得分:2)

C ++是一种编译语言。因此,你不能“动态改变一个类的功能”。只有解释型语言才能做到这一点。

这是你在C ++中可以做的一件事:

#include <functional> // For std::function

bool IsGreaterThan(int a, int b)
    {
    return a > b;
    }

int main()
    {
    // 1. Create a lambda function that can be reused inside main()
    const auto sum = [](int a, int b) { return a + b;};

    int result = sum(4, 2); // result = 6

    // 2. Use std::function to use a function as a variable
    std::function<bool(int, int)> func = IsGreaterThan;

    bool test = func(2, 1); // test = true because 2 > 1
    }

在第二个例子中,我们创建了一个函数指针,它接受参数2 int并返回bool。使用std :: function的好处是你可以将指向成员函数的指针与指向函数的指针混合,只要它们具有相同的参数并返回值。

编辑:这是一个关于如何使用std :: function和std :: bind将成员函数和非成员函数保存在单个向量中的示例。

bool IsGreaterThan(int a, int b)
    {
    return a > b;
    }


typedef bool(*FunctionPointer)(int, int); // Typedef for a function pointer

// Some class
struct SomeClass
{
private:
    vector<FunctionPointer> m_functionPointers;
    vector<std::function<bool(int, int)>> m_stdFunctions;

public:
    SomeClass()
        {
        // With regular function pointers
        m_functionPointers.push_back(IsGreaterThan);
        m_functionPointers.push_back(&this->DoSomething); // C2276: '&' : illegal operation on bound member function expression

        // With std::function
        m_stdFunctions.push_back(IsGreaterThan);
        m_stdFunctions.push_back(std::bind(&SomeClass::DoSomething, this, std::placeholders::_1, std::placeholders::_2)); // Works just fine.
        }

     bool DoSomething(int a, int b) { return (a == b); }
};