C ++ Lambdas和Variadic Templated Wrappers

时间:2015-07-02 16:38:23

标签: c++ c++11 lambda function-pointers variadic-templates

我试图在C ++中执行以下代码。程序将没有捕获的lambda转换为函数指针。

#include <utility>

template <typename R, typename... Args>
R run(R (*func)(Args...), Args&&... args) {
        func(std::forward<Args>(args)...);
}

int main() {
        run([] (int x, int y) {
            return x + y;
        }, 100, 200);
        return 0;
}

但是,当我编译它时,我收到以下错误 -

test.cc: In function ‘int main()’:
test.cc:11:20: error: no matching function for call to ‘run(main()::<lambda(int, int)>, int, int)’
         }, 100, 200);
                    ^
test.cc:11:20: note: candidate is:
test.cc:4:3: note: template<class R, class ... Args> R run(R (*)(Args ...), Args&& ...)
 R run(R (*func)(Args...), Args&&... args) {
   ^
test.cc:4:3: note:   template argument deduction/substitution failed:
test.cc:11:20: note:   mismatched types ‘R (*)(Args ...)’ and ‘main()::<lambda(int, int)>’
         }, 100, 200);
                    ^

据我所知,这很好。我还尝试在调用run时明确给出模板参数。这也不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

lambda 是函数指针。它不能推断为函数指针。这是一个关闭。但是,如果(并且仅当)它不进行捕获,则可以通过some sorcery将其显式转换为函数指针:

    run(+[] (int x, int y) {
    //  ^^^
        return x + y;
    }, 100, 200);

那就是说,让run采用任意可调用的方式更好:

template <typename F, typename... Args>
auto run(F func, Args&&... args) 
    -> decltype(func(std::forward<Args>(args)...)) // only for C++11
{ 
    return func(std::forward<Args>(args)...);
}