将函数名称作为函数的参数传递

时间:2011-06-15 10:26:14

标签: c++ parameter-passing function-calls

是否可以将函数的名称(比如A)作为参数传递给另一个函数(比如说B),然后从函数B中调用函数A.即函数名将存储在B中的变量中,并使用它调用名称在变量中的函数。对于C ++排序函数中的示例,第一个和第二个参数是迭代器,但第三个参数是函数的名称。

5 个答案:

答案 0 :(得分:8)

您可以为“可以使用两个参数调用的任何内容”引入模板参数(此处为Pred):

template <typename Iter, typename Pred>
void mysort(Iter begin, Iter end, Pred predicate)
{
    --end;
    // ...
        if (predicate(*begin, *end))
        {
            // ...
        }
    // ...
}

然后你可以传递好的旧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());
}

如您所见,函数对象是一个类的对象,它适当地重载operator()

答案 1 :(得分:4)

您应该阅读Function Pointers

答案 2 :(得分:3)

,不仅可以,而且还有很好的用途。

从技术上讲,这些被称为function pointers

从概念上讲,他们需要具有回调机制。 event-driven程序可能需要回调。例如,您的应用程序可能有兴趣知道何时单击鼠标按钮。在这种情况下,您将注册您对基础平台的兴趣以获得鼠标单击事件,并告诉它应该在您的程序中调用哪些方法/函数,以便您可以相应地执行代码。

另一种情况是程序具有异步执行模式。例如,在将文件写入硬盘的情况下,与进行算术计算相比,这是一个耗时的过程。因此,在我们将结果写入文件时,我们可能不希望等待执行计算。程序可能选择仅对文件调用 write 函数并返回并开始计算。虽然调用此函数,调用者也可以指定回调函数。因此,当文件成功写入或失败时,将调用回调函数并相应地通知被调用者

答案 3 :(得分:2)

是的,这是可能的。从技术上讲,它不是通过的“名称”,而是实际上是传递函数的指针。

答案 4 :(得分:2)

功能指针的简单示例:

#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;
}

输出:

added result: 6
multiplied result: 8