c++ 将lambda作为参数传递给具有std::function参数的函数,该参数具有任意数量的参数

vwhgwdsa  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(197)

考虑下一个代码示例:

template <typename... TArgs>
void foo(std::function<void(TArgs...)> f) {
}

template <typename... TArgs>
class Class {
public:
    static void foo(std::function<void(TArgs...)> f) {
    }
};

为什么我可以这样做:

int main() {
// Helper class call
    Class<int, int>::foo(
        [](int a, int b) {}
    );
}

但我在执行此操作时遇到编译错误:
一个二个一个一个
我只是想有一个方便的方法来使用foo这样的函数。
我试过这个:

std::function<void(int, int)> f = [](int a, int b) {
    };

    foo<int, int>(f); // ok

它成功了,这没问题,但我想知道是否有办法,在函数调用中直接使用lambdas,而不用创建局部函数对象。

myzjeezk

myzjeezk1#

正因如此:Why is template parameter pack used in a function argument type as its template argument list not able to be explicit specified
当你调用foo<int, int>([](int a, int b) {});时,包TArgs仍然被推导出来,以防它需要被扩展。std::function<void(TArgs...)>不能推导出任何带有lambda参数的TArgs...,所以它被推导为一个空包,这与给定的int, int冲突。
对于Class<int, int>::foo,没有模板参数推导,因为模板参数已经给定。
解决这个问题的一个办法是把它放在一个非演绎的上下文中:

template <typename... TArgs>
void foo(std::type_identity_t<std::function<void(TArgs...)>> f) {
}

或者根本不使用std::function

template <typename F>
void foo(F&& f) {
}

相关问题