我正在尝试使用Allegro 5作为图形引擎编写一些代码来管理屏幕上的大量精灵。
由于许多精灵将使用相同的底层位图,我想使用boost :: flyweight库来模拟位图类型,因此与类似对象类型相关联的位图将不会重复加载到内存中
ALLEGRO_BITMAP直接C类型包含在结构allegro_bitmap_t中,具有适当的用户定义转换,因此可以在必要时直接用作底层C类型。我正在尝试设置flyweight类型,以便可以透明地从unique_ptr取消引用与“常规”类型相同,而无需调用unique_ptr的“get”方法,解除引用,然后使用“get”方法<:: p>。反复提升:: flyweight类型。
namespace GraphicsTypes {
using allegro_bitmap_t = struct B
{
public:
B(int bitmap_w, int bitmap_h) : current_id(id())
{
_bitmap_ptr = al_create_bitmap(bitmap_w, bitmap_h);
if (_bitmap_ptr == nullptr) throw std::bad_alloc();
}
B(const char* filename) : current_id(id())
{
_bitmap_ptr = al_load_bitmap(filename);
if (_bitmap_ptr == nullptr) throw std::bad_alloc();
}
~B() = default;
operator ALLEGRO_BITMAP*() const
{
return _bitmap_ptr;
}
const ALLEGRO_BITMAP& operator* () const
{
return *_bitmap_ptr;
}
const int current_id;
private:
static int id()
{
static int _id = 0;
return _id++;
}
ALLEGRO_BITMAP* _bitmap_ptr;
};
inline std::size_t hash_value(const B& b)
{
return boost::hash<int>()(b.current_id);
}
inline bool operator==(const B& l,const B& r)
{
return l.current_id == r.current_id;
}
inline bool operator!=(const B& l,const B& r)
{
return !(l.current_id == r.current_id);
}
}
有没有办法构建一个“包装器”类型,比如allegro_flyweight_bitmap_t,所以取消引用底层位图可以自动运行?