テストスマートポインタがNULLであります
Qtのプロジェクトでは、OSG、スマートポインタがあります
osg::ref_ptr<int> a;
そして、C ++標準ライブラリが異なる場合があり、スマートポインタが空であるか否かを判断します
「より効果的なC ++」、読んで感じのやりがいから、次の
私はMSVC2017 VS2019のテキストヘッダファイルとOSGの終わりではあり見ます
しかし、我々は「NULLへのスマートポインタを見つける」されることができない一つのことがあります:
SmartPtr<TreeNode> ptn;
if (ptn == 0) ... // error!
if (ptn) ... // error!
if (!ptn) ... // error!
これは重大な制限です。
メンバ関数への参加のisNullスマートポインタクラスが行うには非常に簡単なことです
スマートポインタの動作とダムポインタテスト(で、普通のポインタ)が同様の問題でない場合しかし、それはNULLに対応していません。
別のアプローチは、上記の試験にコンパイラを可能に、暗黙的型変換演算子を提供することです。一般に、この目的のために使用されるvoid *型にキャストされます。
template<class T>
class SmartPtr {
public:
...
operator void*(); // 如果灵巧指针为 null,
... // 返回 0, 否则返回
}; // 非 0。
SmartPtr<TreeNode> ptn;
...
if (ptn == 0) ... // 现在正确
if (ptn) ... // 也正确
if (!ptn) ... // 正确
これは、ライトコードすることが可能である、提供変換iostreamクラスの同じタイプです。
ifstream inputFile("datafile.dat");
if (inputFile) ... // 测试 inputFile 是否已经被
// 成功地打开。
いくつかのケースでは、ほとんどのプログラマは、チューニング、それにしたいけれども:すべての変換機能の種類、それが一つの欠点を持っているとして、同様
の障害を持つが、関数が実際に成功し呼び出すことができます(項目M5を参照)。特に、それはスマートポインタを可能にし、完全に
異なる種類の間で比較すること:
SmartPtr<Apple> pa;
SmartPtr<Orange> po;
...
if (pa == po) ... // 这能够被成功编译!
でもSmartPtrで
スマートポインタは、暗黙的に無効に変換されるため
、ポインタビルトイン建て比較関数の型へのポインタを。このような前進
ライン暗黙の型変換の挙動特性は非常に危険。(繰り返し読まれなければならない、M5の条件を見て戻って馴染み、是非
詳細に検討することを。)
無効に
型変換、また、いくつかの変更があります。const void *型の型変換にいくつかのデザイナー、
およびいくつかの方法が取らBOOLに変換します。これらの変更は、混合型の比較の問題がなくなるわけではありません。
構文合理的なテストのヌル値だけでなく、スマートポインタのさまざまな種類の提供するポリシーの共存がある
最小の間で比較する可能性が。
スマートポインタがNULLポインタである場合にのみ場合、これはスマートポインタクラスの演算子をオーバーロードされた!、オペレータは、trueを返します!:
template<class T>
class SmartPtr {
public: ...
bool operator!() const; // 当且仅当灵巧指针是
... // 空值,返回 true。
};
用户程序如下所示:
SmartPtr<TreeNode> ptn;
...
if (!ptn) { // 正确
... // ptn 是空值
}
else {
... // ptn 不是空值
}
但是这样就不正确了:
if (ptn == 0) ... // 仍然错误
if (ptn) ... // 也是错误的
仅在这种情况下会存在不同类型之间进行比较:
SmartPtr<Apple> pa;
SmartPtr<Orange> po;
...
if (!pa == !po) ... // 能够编译
幸いなことに、プログラマは、多くの場合、コードを記述しないでください。
興味深いことに、iostreamのライブラリーのボイド達成提供することに加えて、暗黙の
型変換をするだけでなく、オペレータ!機能が、これらの2つの関数の流動状態が正常にテストが多少異なっています。
(標準C ++ライブラリでは()項目49の効果的なC ++ブックの利用規約およびM35を参照してください
ボイド*暗黙の型変換は、変換ブールのタイプによって置き換えられている、ブール演算子は常にオペレータに値反対を返します!)
OSGでもオペレータをオーバーロードしています!
画像が投稿されていません