【问题标题】:Creating a std::function with a lambda without knowing the arguments of the function在不知道函数参数的情况下使用 lambda 创建 std::function
【发布时间】:2019-12-15 19:47:11
【问题描述】:

我想在template 中从lambda 创建一个std::function,它将所需的std::function 实例作为其参数:

template <class functionT>
functionT make_lambda() {
    return [](/* ignore all args */){ std::cout << "my lambda\n"; };
}

然后用不同的aliasesstd::function 调用template

using function_no_args = std::function<void(void)>;
using function_args = std::function<void(int)>;

make_lambda<function_no_args>()(); // output: "my lambda"
make_lambda<function_args>()(999); // compile error

我怎样才能做到这一点?

一些精度:

  • 我需要能够为 std::function 提供别名,在 traits 结构中定义它们并将它们传递给我的代码的多个部分
  • 返回类型将始终为void,只有参数可能会改变

【问题讨论】:

  • 您是否只是希望您的 lambda 可以使用任何类型的参数调用,或者您是否需要您的 lambda 只能使用与 std::function 的签名相对应的参数调用并且其他所有操作都失败编译?
  • @MichaelKenzel 我希望它可以使用签名的参数调用(我不会在不传递 int 的情况下调用 function_args)

标签: c++ templates lambda std-function


【解决方案1】:

只需使用带有参数包的通用 lambda 即可吞下并忽略可能提供给它的任何参数:

template <class functionT>
functionT make_lambda() {
    return [](auto&&...){ std::cout << "my lambda\n"; };
}

【讨论】:

  • 你打败了我 :)
【解决方案2】:

如果您可以接受不同的通话方式

make_lambda<function_no_args>::func()();
make_lambda<function_args>::func()(999);

您可以使用模板特化使make_lambda 成为函数

template <typename>
struct make_lambda;

template <typename ... Args>
struct make_lambda<std::function<void(Args...)>>
 {
   static std::function<void(Args...)> func ()
    { return [](Args ...){ std::cout << "my lambda\n"; }; }
 };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多