我想知道是否可以在C ++中执行此操作?
e.g:
varFunction = void TestFunction();
RunCode(varFunction);
答案 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