C++智能指针可以完全封装其数据吗?

use*_*370 2 c++ smart-pointers

是否可以将原始C++指针包装在类似智能指针的类中,这将允许用户使用熟悉的运算符(如数组和间接)进行更新:

int i;
my_ptr<int> ptr(i);
ptr[i] = 42;
Run Code Online (Sandbox Code Playgroud)

但是,绝对会拒绝用户访问底层的原始地址.所以,这不应该成功:

int *p;
p = &ptr[i];
Run Code Online (Sandbox Code Playgroud)

唉,我担心我可能会问不可能.我可以使用getter和setter方法,但我很好奇我是否可以不用.

Ben*_*ley 5

通过代理类过滤访问权限,例如这个(不完整的示例):

template<typename T>
class proxy
{
    proxy(T & v) :value_(v) {}
    proxy & operator=(const T & v) { value_ = v; return *this; }
private:
    T & value_;
};
Run Code Online (Sandbox Code Playgroud)

该类需要更多的工作,但一旦完成,如果你operator[]返回其中一个,它可以从a分配T,但你不能得到的地址T.

编辑

谢谢你的选票.但这个答案并不像你想象的那么好.它不允许用户执行除代理中定义的操作之外的任何其他操作.因此,例如,这不起作用:

my_ptr<int> ptr(x);
...
ptr[i]++;
Run Code Online (Sandbox Code Playgroud)

除非代理类专门针对每种类型,并且谁想要这样做?