我正在做一个项目,其中某些对象被引用计数——这是一个与 COM 非常相似的设置。无论如何,我们的项目确实有智能指针,可以减少为这些对象显式调用 Add() 和 Release() 的需要。问题是有时,开发人员仍然使用智能指针调用 Release()。
我正在寻找的是一种从智能指针调用 Release() 创建编译时或运行时错误的方法。编译时间对我来说似乎是不可能的。我以为我有一个运行时解决方案(见下面的代码),但它也不能完全编译。显然,使用 operator->() 后不允许隐式转换。
无论如何,任何人都可以想出一种方法来完成我想要完成的事情吗?
非常感谢您的帮助!
凯文
#include <iostream>
#include <cassert>
using namespace std;
class A
{
public:
    void Add()
    {
        cout << "A::Add" << endl;
    }
    void Release()
    {
        cout << "A::Release" << endl;
    }
    void Foo()
    {
        cout << "A::Foo" << endl;
    }
};
template <class T>
class MySmartPtrHelper
{
    T* m_t;
public:
    MySmartPtrHelper(T* _t)
        : m_t(_t)
    {
        m_t->Add(); 
    }
    ~MySmartPtrHelper()
    {
        m_t->Release(); 
    }
    operator T&()
    {
        return *m_t;
    }
    void Add()
    {
        cout << "MySmartPtrHelper::Add()" << endl;
        assert(false);
    }
    void Release()
    {
        cout << "MySmartPtrHelper::Release()" << endl;
        assert(false);
    }
};
template <class T>
class MySmartPtr
{
    MySmartPtrHelper<T> m_helper;
public:
    MySmartPtr(T* _pT)
        : m_helper(_pT)
    {
    }
    MySmartPtrHelper<T>* operator->()
    {
        return &m_helper;
    }
};
int main()
{
    A a;
    MySmartPtr<A> pA(&a);
    pA->Foo(); // this currently fails to compile.  The compiler
               // complains that MySmartPtrHelper::Foo() doesn't exist.
    //pA->Release(); // this will correctly assert if uncommented.
    return 0;
}