繁体   English   中英

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

[英]Passing Function name as arguments to a function

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

您可以为“可通过两个参数调用的任何对象”引入模板参数(此处为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()的类的对象。

您应该阅读函数指针

功能指针的简单示例:

#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

是的 ,不仅有可能,而且用途也非常广泛。

从技术上讲,这些称为函数指针

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM