如何在成员函数中的C ++中创建一个优雅的for_each(),其中操作函数是同一个类中的另一个成员函数?

时间:2010-08-05 05:22:19

标签: c++ stl map foreach

这是我正在尝试做的事情:

//ImageCache.h:
#include <map>
#include <SDL.h>

typedef pair<const wchar_t*, SDL_Surface*> ImageNameAndSurface;
class ImageCache {
// Functions
    public:
        ImageCache();
        ~ImageCache();
        SDL_Surface* getImage(const wchar_t* imageFilename);
// Variables
    private:
        map<const wchar_t*, SDL_Surface*> imageFileMap;
        void freeImage(const pair<const wchar_t*, SDL_Surface*>& pr); //function for_each() is to operate on
};

//ImageCache.cpp:
#include "ImageCache.h"
#include <algorithm>
#include <SDL_image.h>

ImageCache::ImageCache() {}
void ImageCache::freeImage(const pair<const wchar_t*, SDL_Surface*>& pr)
{
  wcout << "Freeing " << pr.first << endl;
  SDL_FreeSurface(pr.second);
}

ImageCache::~ImageCache() {
    for_each(imageFileMap.begin(), imageFileMap.end(), freeImage);
}

我正在使用MSVC 2005(针对Windows CE 5.0进行编译),我收到以下错误:

  

错误C3867:'ImageCache :: freeImage':   函数调用缺少参数列表;   使用'&amp; ImageCache :: freeImage'来创建   指向成员的指针

我理解for_each()的函数参数需要一个静态函数(如果我将freeImage声明为static,则所有这些都有效)但我想知道如何为非静态成员函数执行此操作。我不明白隐含的“this”指针是如何传递给对freeImage()的调用的。任何帮助是极大的赞赏!我用谷歌搜索了一个小时,由于某种原因没有找到相同的情况。

我应该补充一点,我试图避免重载()运算符,因为这似乎不必要的冗长和其他类似的,但显然不可编译的方法也避免这种情况。

3 个答案:

答案 0 :(得分:2)

如果您不想使ImageCache::freeImage成为静态成员函数,则需要传递this指针。如果您不想制作一个operator ()重载的辅助类,可以使用boost::bind为您动态创建仿函数:

for_each(imageFileMap.begin(), imageFileMap.end(),
         boost::bind(&ImageCache::freeImage, this, _1, _2));

答案 1 :(得分:1)

“for_each”是一个独立的函数,它不是你的类的成员,所以它不知道传递“this”指针或使用成员函数语法调用。

在那个平台上你可能需要mem_fn(使这个指针显式)和bind1st(传递this指针)。 tr1 :: bind(以前称为boost.bind)我认为你无法使用它,但如果它是一个优秀的解决方案并且取代了bind1st等。

答案 2 :(得分:1)

不是

for_each(imageFileMap.begin(), imageFileMap.end(), freeImage);

但是

for_each(imageFileMap.begin(), imageFileMap.end(),&ImageCache::freeImage);

有问题的错误

但是你仍然会遇到问题,因为ImageCache::freeImage是非静态的(虽然它可能是静态的)成员函数。

使freeImage保持静态,上面的更改应该有所帮助。