C++ 存储函数调用和稍后调用的参数列表

C++ 存储函数调用和稍后调用的参数列表,c++,locking,C++,Locking,我的代码由于锁而面临性能问题。请参见下面的草图(无论如何都不能发布太大的实际代码): 现在我想将func1、func2和func3从锁定/解锁范围中移出。请提出有效的方法。有没有一种方法可以存储函数调用及其参数,以便以后调用 将所有参数存储在成员结构中,将函数指针存储在std::list中如何 编辑: 很抱歉在我还没有使用c++11之前没有提到这一点。现在,任何没有std:function和std:bind的解决方案都很好。您确定可以这样做: typedef std::vector<std

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

现在我想将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;
}
typedef标准::向量f_列表;
XYZ::进程(){
//我们的功能列表
f_列表fl;
锁();
fl=进程共享数据(id);
解锁();
//调用函数
对于(自动&f:fl)f();
}
f_列表XYZ::processSharedData(对象id){
f_列表fl;
obj a=accessDataAttr1(id);
//做一些完整性检查
向前推(
std::bind(&func1、attr1、attr2、attr3)
);
obj b=accessDataAttr2(id);
//做一些完整性检查
//评估一些条件,然后
向前推(
std::bind(&func2,attr1,attr2,attr3)
);
//等等
返回fl;
}
参考


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

fl.push_back(
    std::bind(&func1, this, attr1, attr2, attr3)
);
稍后调用这些函数时,您可以使用C++11中的另一个新功能:


向上看,不要用它们。其他帖子请看我的评论。谢谢。看起来不错,但是没有std:function和std::bind的解决方案吗?别忘了,bind和function都可以从大型产品开发的boostPart中获得,所以我不能决定使用新的标准/版本。在我的公司里也没有人使用boost。@LovelyVirus我意识到你的问题很普遍,但这很愚蠢。Boost是一个高质量的库,具有许可(商业版)免费许可。除了这个,我真的帮不了你。我建议你告诉你的上司,C++11和/或boost上的这些限制使你的工作变得非常困难和/或生产出劣质产品。我同意你的看法。为什么不使用现有的最新技术?可能对于我们产品的新版本,他们可能会使用它,但我必须修复旧版本中的问题,所以遗憾的是,我不得不接受现有的产品。不过,谢谢你的帮助。正如在回复其他帖子时提到的,我还不能使用c++11。
fl.push_back(
    std::bind(&func1, this, attr1, attr2, attr3)
);
for (auto f : fl)
    f();