This引用for_each如下:
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);
我有一个集合std::list<std::string>
,函数void Do(std::string)
在与for_each
和迭代器一起使用时效果很好。但是如果我提供像void Do(std::string&)
这样的函数,它就不会编译。有办法解决吗?或者我应该忘记它,因为一些像魔法一样的RVO正在进行中? :d
编辑:
bool PluginLoader::LoadSharedObjects()
{
for_each(l_FileNames.begin(), l_FileNames.end(), bind1st(mem_fun(&PluginLoader::LoadSharedObject),this));
}
void PluginLoader::LoadSharedObject(const std::string sFileName)
{
void* pHandle = dlopen(sFileName.c_str(), i_LibMode);
//if(pHandle == NULL)
//Check dlerror
//Add handle to list
}
添加了代码。如果有可能,我希望LoadSharedObject
函数的格式为void PluginLoader::LoadSharedObject(const std::string& sFileName)
。
答案 0 :(得分:3)
错误不是使用for_each而是使用bind1st和mem_fun。他们根本不支持你想要做的事情。它们无法处理带参考参数的函数。您可以编写您自己的仿函数,使用 boost :: bind 或等到您能够使用C ++ 0x lambdas。
您自己的仿函数的示例:
struct LoadSharedObjFunctor
{
PluginLoader *pl;
public:
explicit(PluginLoader *p)
: pl(p) {}
void operator()(std::string const& cref) const
{ return pl->LoadSharedObject(cref); }
};
...
std::for_each(...,...,LoadSharedObjFunctor(this));
...
当然,你没有拥有来使用std :: for_each。一个简单的for循环也可以。
答案 1 :(得分:1)
如果您被允许使用提升,那么您想要的是boost:::bind
。
#include <boost/bind.hpp>
...
for_each(l_FileNames.begin(),
l_FileNames.end(),
boost::bind(&PluginLoader::LoadSharedObject, this, _1));
只是为了好玩,这就是为什么你所尝试的不起作用的原因:
此mem_fun(&PluginLoader::LoadSharedObject)
会创建mem_fun1_t<void, PluginLoader, const string &>
类型的对象。
因此bind1st(mem_fun(&PluginLoader::LoadSharedObject),this)
会创建binder1st< mem_fun1_t<void, PluginLoader, const string &> >
类型的对象。
问题是binder1st
定义了一个看起来像这样的函数:
ResultType operator()(const ArgType &)
,其中ArgType
为const string &
。因此,它有效地意味着您正在尝试形成对引用的引用。
答案 2 :(得分:0)
目前的标准尚不清楚是否应该允许使用for_each
,并且不同的实现行为不同 - 有些人接受但有些人不接受。有些人认为这是不幸的,所以如果迭代器是可修改的,那么C ++ 0x将通过显式允许传递给for_each
的变异操作来修复这种情况。
在编辑:const引用不是问题。你得到了什么错误?