Bal*_*ash 5 c++ parameter-passing function-calls
是否可以将函数的名称(比如A)作为参数传递给另一个函数(比如说B),然后从函数B中调用函数A.即函数名将存储在B中的变量中,并使用它调用名称在变量中的函数.例如,在C++排序函数中,第一个和第二个参数是迭代器,但第三个参数是函数的名称.
您可以Pred为"可以使用两个参数调用的任何内容" 引入模板参数(此处):
template <typename Iter, typename Pred>
void mysort(Iter begin, Iter end, Pred predicate)
{
--end;
// ...
if (predicate(*begin, *end))
{
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以传递好的旧C函数指针或C++函数对象:
bool function(int x, int y)
{
return x < y;
}
struct function_object
{
bool operator()(int x, int y)
{
return x < y;
}
};
int main()
{
int numbers[] = {543, 6542654, 432514, 54, 45, 243};
mysort(numbers + 0, numbers + 6, &function);
mysort(numbers + 0, numbers + 6, function_object());
}
Run Code Online (Sandbox Code Playgroud)
如您所见,函数对象是一个operator()适当重载的类的对象.
函数指针的简单示例:
#include <iostream>
int apply(int (*fun)(int,int), int a, int b) {
return (*fun)(a,b);
}
int add(int a, int b) {return a + b;}
int multiply(int a, int b) {return a * b;}
int main(int argc, const char* argv[]) {
int added = apply(add, 2, 4);
int multiplied = apply(multiply, 2, 4);
std::cout << "added result: " << added << std::endl;
std::cout << "multiplied result: " << multiplied << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
added result: 6
multiplied result: 8
Run Code Online (Sandbox Code Playgroud)