スマートポインタがNULLであるかどうかを確認

テストスマートポインタが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で そして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でもオペレータをオーバーロードしています!

画像が投稿されていません

しかし、誰VSはありません

おすすめ

転載: www.cnblogs.com/yahoo17/p/12329023.html