有没有办法让for_each参考?

时间:2010-10-13 06:56:26

标签: c++ functional-programming

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)

3 个答案:

答案 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 &),其中ArgTypeconst string &。因此,它有效地意味着您正在尝试形成对引用的引用。

答案 2 :(得分:0)

目前的标准尚不清楚是否应该允许使用for_each,并且不同的实现行为不同 - 有些人接受但有些人不接受。有些人认为这是不幸的,所以如果迭代器是可修改的,那么C ++ 0x将通过显式允许传递给for_each的变异操作来修复这种情况。

在编辑:const引用不是问题。你得到了什么错误?