0

我有一个名为 MemMgr 的 C++ 单例工厂类,它负责管理库中对象的堆内存:

#include <vector>
class MemMgr
{
    public:

        // Callback interface of functions to register with MemMgr
        typedef size_t (*MemSizeFunc)(void);

        void Register(MemSizeFunc memSizeFunc);

        static MemMgr & GetInst(void);

        // more public functionality related to managing memory

    private:

        // a vector (not a map) of functions pointers to keep track of
        std::vector<MemSizeFunc> m_memSizeFuncs;

        MemMgr(void);
        MemMgr(MemMgr const &);
        MemMgr & operator= (MemMgr const &);

        // more private functionality related to managing memory
};

我想做的是让任何想要使用托管内存的类的对象都能够通过(非静态)成员函数向 MemMgr 注册自己,该函数将计算并返回托管内存的数量该特定对象需要的。类似于以下内容:

class MemMgrUser
{
    public:

        MemMgrUser(void)
        {
            MemMgr::GetInst().Register(GetManagedMemSize);
        }

    private:

        size_t GetManagedMemSize(void)
        {
            // calculations involving member variables
        }
};

(然后,在 MemMgr 实际分配任何内存之前,它会查询注册到它的与大小相关的函数,以找出要分配的内存量。)

但是,当我尝试上述方法时,编译器会对我大喊大叫 b/c 我试图注册成员函数指针,而不是普通的函数指针。

有人对我如何实现此类功能有任何建议吗?我在查看如何实现模板实现(或多态实现)时遇到问题。

谢谢,

亚伦

4

1 回答 1

0

您甚至不会尝试注册成员函数指针。那必须指定为&MemMgrUser::GetManagedMemSize. 不能使用成员函数的普通名称,除非在调用它的表达式中。

但是,即使您有一个成员函数指针,它也不能以与具有相同明显签名的普通函数指针相同的方式使用。调用成员函数总是需要一个对象来调用它。函数中可用的this指针是一个附加的隐藏参数。

如果您可以使用 C++11 标准库的功能,则可以typedef std::function<size_t (void)> MemSizeFunc;代替当前的 typedef。这使您可以将可使用该签名调用的各种函数和函数对象存储为MemSizeFunc. 特别是,您可以注册GetManagedMemSize绑定到合适MemMgrUser对象的成员函数,例如:

MemMgrUser()
{
   MemMgr::GetInst().Register(std::bind(&MemMgrUser::GetManagedMemSize, *this));
}
于 2013-02-11T20:39:01.600 回答