同时接受lambda函数和函数指针作为参数

Accept both lambda-functions and function-pointers as argument

本文关键字:函数 指针 参数 lambda      更新时间:2023-10-16

我有一个函数,比如

void processSomething(Arg1 arg1, Function t){
    ...
    t(someVariable);
}

我希望下面两种用法都能起作用:

processSomething(myArg1, [&](SomeVariable someVar){...});
void(*myFunc)(void) = &someFunc;
processSomething(myArg1, myFunc);

然而,我发现当使用void(*myFunc)(void)作为参数声明时,我不能使用lambda方式。有没有办法在不使用两个单独的函数或过于复杂的包装器的情况下同时使用这两种用法?

你有两个选择:

  1. 模板:

    template<class F>
    void processSomething(Arg1 arg1, F t){
    

    这是首选的方法,因为它可以创建更高效的代码,但代价是可能的代码重复。

  2. 使用std::function或其他:

    void processSomething(Arg1 arg1, std::function<void(SomeVariable)> t){
    

    间接涉及运行时成本,但在每种情况下都将使用相同的代码。