[英]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
要构建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.