gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:53 25 4
gpt4 key购买 nike

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

//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 编译),但出现以下错误:

error C3867: 'ImageCache::freeImage': function call missing argument list; use '&ImageCache::freeImage' to create a pointer to member

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

我应该补充一点,我正在努力避免重载 () 运算符,因为这看起来不必要地冗长,而其他类似但显然不可编译的方法也可以避免这种情况。

最佳答案

如果你不想让ImageCache::freeImage成为一个静态成员函数,那么你需要传递this指针。如果你不想做一个重载operator()的小辅助类,你可以使用boost::bind即时为您创建仿函数:

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

关于c++ - 如何在 C++ 中的成员函数中创建一个优雅的 for_each(),其中操作函数是同一类中的另一个成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3411953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com