【问题标题】:C++: store list of lambda functionsC++:存储 lambda 函数列表
【发布时间】:2021-08-06 19:20:25
【问题描述】:

我需要创建一个向量来存储具有不同数量参数的 void 函数。我为此使用了可变参数模板,但它不起作用。

#include <iostream>
#include <functional>

template<class...Types>
using MyFun = std::function<void(Types...)>;

std::vector<MyFun<>> operators;

template<class Lambda>
void addOperator(Lambda lambda)
{
    operators.emplace_back(lambda);
}

int main()
{
    auto f1 = [](int a, int b){std::cout<<a+b;};
    auto f2 = [](double a, double b){std::cout<<a+b;};
    addOperator(f1);
    addOperator(f2);

    return 0;
}

你能帮帮我吗?

【问题讨论】:

  • 这个列表的目的是什么?你想如何调用这些函数?
  • 如果您不知道这些函数的参数类型,您将如何使用它们?您可以使用std::any 的向量,但接下来呢?
  • MyFun 的每个实例化都是不同的不同类型。如果没有某种类型的擦除,您不能将它们存储在同一个容器中。 std::function 浮现在脑海中,但这不适用于不同的函数签名。你应该重新考虑你的设计。对于静态类型语言,这看起来不是一个好方法。
  • 类似的问题经常出现。他们几乎从不谈论调用函数,或者一旦将它们放入容器中后如何处理它们,但这是重要的部分。考虑到您可以将任何东西放入void* 的容器中,但对于这样的容器几乎无能为力
  • 这个问题显然受到XY problem的影响。 @JoungCPPser 请解释你为什么需要这个功能,你想要什么样的功能(不要描述你打算如何实现它,因为很明显它不起作用)。

标签: c++ function templates variadic-templates


【解决方案1】:

假设您有少量可能的类型,下面是一个示例:

#include <stdio.h>

#include <variant>
#include <vector>

// this helper is from https://en.cppreference.com/w/cpp/utility/variant/visit
template <class... Ts>
struct overloaded : Ts... {
  using Ts::operator()...;
};

template <class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;

int main() {
  using T1 = void (*)(int, int);
  using T2 = void (*)(double, double);

  T1 const f1 = [](int a, int b) { printf("int add: %d\n", a + b); };
  T2 const f2 = [](double a, double b) { printf("double add: %f\n", a + b); };

  std::vector<std::variant<T1, T2>> vec{f1, f2};
  // add more elements if needed

  for (auto const& f : vec) {
    // example usage
    std::visit(overloaded([](T1 const& f) { f(1, 2); },
                          [](T2 const& f) { f(1.5, 2.3); }), f);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2018-04-09
    • 2021-04-21
    • 2012-11-20
    • 1970-01-01
    • 2017-09-28
    • 2017-01-21
    相关资源
    最近更新 更多