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

时间:2012-10-28 12:06:21

标签: c++ locking

由于锁定,此代码面临性能问题。请参见下面的草图(无论如何都不能发布过大的实际代码):

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的任何解决方案现在都很棒。

2 个答案:

答案 0 :(得分:5)

确定你可以这样做:

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

答案 1 :(得分:4)

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

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

稍后当你调用这些函数时,可以使用C ++ 11中的另一个新功能:range-based for loop

for (auto f : fl)
    f();