(おそらくプリプロセッサマクロを使用して)削除を呼び出すことができないことを除いて、通常のポインターのように(構文に関して)動作および動作するポインター型を構築することは可能ですか?
使用例:
borrowed_ptr<int> ptr = new int[42];
ptr[12] = 1;
cout<<ptr[12]<<endl; //prints 1
delete ptr; //error: no operator delete for borrowed_ptr<int>
borrowed_ptr<int> ptr2 = new int(2);
delete ptr2; //error
また、これも機能するはずです
template<typename t>
void func(borrowed_ptr<t> *arg)
{
delete arg; //error
}
//somewhere else
int *t = new *int;
func(t);
ただし、「逆割り当て」は機能しません。
borrowed_ptr<int> foo = new int(2);
int* bar = foo; //error
Bored_ptr を宣言するときに * が必要かどうかは、私には関係ありません。コードが次のようになることが重要です
template <typename T>
void foo(T* whatever)
{
//do something with whatever
delete whatever;
}
template <typename T>
void bar(T* whatever)
{
//do something with whatever
}
次のように、このbored_ptrで呼び出すことができます:
borrowed_ptr<int> a = new int(2);
foo(a); //error, function tries to delete
bar(a); //fine, and has the same semantics as handing over a raw int*
注: ポインターの型が削除自体の場合、データを削除したくありません。他の誰かに属しているため、削除できない借用した ptr である必要があります。