将任何lambda作为公共回调对象存储在向量中

时间:2018-11-13 13:28:20

标签: c++ function lambda

我有一个梦想。我可以将传递给函数的lambda表达式存储为向量,作为包装在类中的对象。 然后,它们将在给定的点上运行,如果它们具有返回值,则可以获取它。

我一直在尝试找到一种方法来做到这一点,例如我的其他帖子停滞了Vector with objects that have function pointers of varying type

我想要这种方式的原因是,它尽可能动态且易于在任何情况下使用。 在当前情况下,它将用于在跨单独的进程和内存空间执行任务的进化算法中。

我的梦想不可行,还是设计不好?你知道更好的方法吗?我已经待了好几天了,没有任何东西可以编译。

我很高兴能指出正确的方向。

基本上遵循以下原则:

    std::vector<CallbackJob> myCallbackList;
    std::vector<CallbackJobResult> myCallbackResultList;

    Callback myCB = make_callback( [&]{ return Task->Test("I return boolean"); } );
    Callback myCB2 = make_callback( [&]{ return Foo("I return doubles"); } );

    CallbackJob job1("name1", myCB, 1);
    CallbackJob job2("name2", myCB2, 5);

    myCallbackList.push_back(job1);
    myCallbackList.push_back(job2);

    for(auto &i : myCallbackList) {
    // maybe need to check if it has a return value, embed it into the callback object itself?
        myCallbackResultList.push_back( i.callback() );  
    }

1 个答案:

答案 0 :(得分:1)

您可以使用类型擦除(例如std::anystd::function)将lambda及其结果值存储在矢量中:

std::vector<std::function<std::any()>> functions;
functions.emplace_back([]{ return std::any(1.0); });
functions.emplace_back([]{ return std::any(true); });

std::vector<std::any> results;
for (auto & f : functions)
  results.emplace_back(f());

问题是如何处理results的元素,因为您需要知道它们的类型才能使用std::any_cast进行转换。在此示例中,您可以使用例如:

for (const auto & r : results)
  if (r.type() == typeid(double))
    std::cout << std::any_cast<double>(r);
  else if (r.type() == typeid(bool))
    std::cout << std::any_cast<bool>(r);

还请注意,只有在所有lambda都没有参数或者最终没有相同类型的参数时,此方法才有效。