由于锁定,此代码面临性能问题。请参见下面的草图(无论如何都不能发布过大的实际代码):
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的任何解决方案现在都很棒。
答案 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
答案 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();