相关疑难解决方法(0)

C++ 17:使用泛型variadic lambda包装可调用

我想在另一个callable中透明地包装任何类型的可调用(例如lambda)以注入其他功能.包装器的类型应该与原始可调用的类型相同:

  • 相同的参数类型
  • 相同的退货类型
  • 完美转发传递的参数
  • 在SFINAE构造中使用时的行为相同

我试图使用泛型variadic lambdas作为包装:

#include <iostream>
#include <type_traits>

template<class TCallable>
auto wrap(TCallable&& callable) {
    return [callable = std::forward<TCallable>(callable)](auto&&... args) -> std::invoke_result_t<TCallable,decltype(args)...> {
        std::cout << "This is some additional functionality" << std::endl;
        return callable(std::forward<decltype(args)>(args)...);
    };
}

int main(int argc, char *argv[])
{
    auto callable1 = []() {
        std::cout << "test1" << std::endl;
    };

    auto callable2 = [](int arg) {
        std::cout << "test2: " << arg << std::endl;
    };

    auto wrapped1 = wrap(callable1);
    auto wrapped2 = wrap(callable2);

    static_assert(std::is_invocable_v<decltype(callable1)>); // …
Run Code Online (Sandbox Code Playgroud)

c++ lambda wrapper perfect-forwarding c++17

5
推荐指数
1
解决办法
218
查看次数

标签 统计

c++ ×1

c++17 ×1

lambda ×1

perfect-forwarding ×1

wrapper ×1