我有一个梦想。我可以将传递给函数的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() );
}
答案 0 :(得分:1)
您可以使用类型擦除(例如std::any
和std::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都没有参数或者最终没有相同类型的参数时,此方法才有效。