繁体   English   中英

存储函数调用和参数列表以便稍后调用

[英]Storing functions call and list of parameters to invoke later

我有这个代码由于锁定而面临性能问题。 请参见下面的草图(无论如何都无法发布实际代码太大):

XYZ::process()
{
  ...
  lock();
  processSharedData(id );
  unlock();
  ...
}

XYZ::processSharedData(obj id)
{
  obj a = accessDataAttr1(id);
  //do some integrity checks

  //evaluate some conditions and then
  func1(attr1, attr2, attr3, ...);

  obj b = accessDataAttr2(id);
  //do some integrity checks

  //evaluate some conditions and then
  func2(attr1, attr2, attr3, ...);

  obj c = accessDataAttr3(id);
  //do some integrity checks

  //evaluate some conditions and then
  func3(attr1, attr2, attr3, ...);

  //do some clean up
  return;
}

现在我想从锁定/解锁范围中移出func1,func2和func3。 请建议有效的方法。 有没有办法存储函数调用及其参数以便稍后调用它?

如何将成员结构中的所有参数和std :: list中的函数指针存储起来?

编辑:

很抱歉在此之前我还没有提及c ++ 11。 没有std:function和std:bind的任何解决方案现在都很棒。

确定你可以这样做:

typedef std::vector<std::function<void(void)>> f_list;

XYZ::process() {
  //our function list
  f_list fl;
  lock();
  fl=processSharedData(id );
  unlock();
  //invoke functions
  for(auto& f : fl) f();
}

f_list XYZ::processSharedData(obj id) {
  f_list fl;
  obj a = accessDataAttr1(id);
  //do some integrity checks

  fl.push_back(
       std::bind(&func1, attr1, attr2, attr3)
  );

  obj b = accessDataAttr2(id);
  //do some integrity checks

  //evaluate some conditions and then
  fl.push_back(
       std::bind(&func2, attr1, attr2, attr3)
  );
  //and so on
  return fl;
}

参考

http://en.cppreference.com/w/cpp/utility/functional/bind

http://en.cppreference.com/w/cpp/utility/functional/function

http://en.cppreference.com/w/cpp/container/vector

要构建111111的答案,如果要调用的函数是XYZ类中的成员函数,则必须将实例作为第一个参数传递:

fl.push_back(
    std::bind(&func1, this, attr1, attr2, attr3)
);

稍后当您调用这些函数时,您可以使用C ++ 11中的另一个新功能:基于范围的for循环

for (auto f : fl)
    f();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM