如何将函数设置为变量并从中调用?

时间:2017-07-08 08:19:18

标签: c++

我想知道是否可以在C ++中执行此操作?

e.g:

varFunction = void TestFunction();
RunCode(varFunction);

4 个答案:

答案 0 :(得分:5)

使用C ++ 11及更高版本,您可以使用std::function来存储函数指针和函数对象。

但是从一开始就在C ++中存储function pointers。这意味着您可以存储函数的地址并稍后调用它。

顺便说一句,lambda expressions也非常有用(他们所表示的closure可以作为std::function指定或传递 - s)

这是一个示例,显示了实现您所要求的三种不同方法:

#include <iostream>
#include <functional>

void RunCode(const std::function<void()>& callable) {
    callable();
}

void TestFunction() {
    std::cout << "TestFunction is called..." << std::endl;
}

int main() {
    std::function<void()> varFunction_1 = TestFunction;
    void (*varFunction_2)() = TestFunction;

    RunCode(varFunction_1);
    RunCode(varFunction_2);
    RunCode([]() { std::cout << "TestLambda is called..." << std::endl; });

    return 0;
}

但这只是冰山一角,传递函数指针和函数对象作为参数在algorithms library中很常见。

答案 1 :(得分:3)

C ++提供了几种方法。

例如,您可以使用std::function模板:include // get the first element in the Row val texts = sqlContext.sql("...").map(_.get(0)) // get the first element as an Int val texts = sqlContext.sql("...").map(_.getInt(0)) 并使用以下语法(demo):

<functional>

您还可以使用函数指针(Q&A on the topic)。

答案 2 :(得分:1)

为了完整起见,您可以按如下方式声明C风格的函数类型:

typedef int (*inttoint)(int);

这会创建一个类型inttoint,它可以存储任何以int作为参数并返回int的函数。您可以按如下方式使用它。

// Define a function
int square(int x) { return x*x; }

// Save the function in sq variable
inttoint sq { square };

// Execute the function
sq(4);

从C ++ 11开始,这些变量也可以存储lambda函数,如此

inttoint half { [](int x) { return x/2; } };

并使用与上述相同的内容。

答案 3 :(得分:0)

最简单的方法是使用这样的lambda表达式:

auto add = [](int a, int b) { return a+b; };
cout << add(10, 20) << endl; // Output: 30

有关lambda表达式如何工作的更多信息:http://en.cppreference.com/w/cpp/language/lambda