そのため、シンビリングクライアントを実装するMFCの比較的大きなプロジェクトのサポートを開始すると、データベースにNULLを渡す必要があるたびに、次のようなチェックを含む追加コードが(条件付きで)あることがわかりました。
//... void CSomeClass::someFunction(double variable) { //... if (variable == 0) { db->addValue(NULL); } else { db->addValue(variable); } //…
NULL値の読み取りと書き込みを必要とするこのプロジェクトに新しい機能を実装する必要に直面したとき、すぐにプロジェクトにNullableタイプのサポートを組み込みたいと思いました。これは、それらを作成し、異なる値を割り当てるためのメモリリークの観点からシンプルで安全なソリューションを提供しますメモリ内の値への入力ポインタを取得する既製の関数にコピーして転送します。
今まで、私はBoostライブラリを使用する必要はありませんでしたが、私はそれについて聞いて、考えました:「素晴らしい、それを感じる時が来ました。」 さらに、トピック「c ++ nullable type」の「google」は、何らかの理由でBoost :: Optionalを示唆していました。
ただし、Boost :: Optionalが私に合わない(および/または気に入らない)ことにすぐに気付きました。 最初に、その研究とプロジェクトへの接続はタスクに費やされた時間の推定に含まれていませんでした、そして次に、Boost :: Optionalから通常の「ポインタ」タイプCに変換するときに問題が発生することに気づきました(おそらくここで間違っていました)少なくとも、コードではあまり見栄えがよくありません)、言い換えると、私はそれを使用するのが困難になるという事実にまったく準備ができていませんでした。 たぶん全体的なポイントは、ジェフ・アルジャーの本「C ++ for real Programmers」を背後に持っていて、あらゆる種類のスマートな(そうではない)ポインターと演算子のオーバーロードを実装するための私の頭の中にさまざまなソリューションがあったため、理解できなかったということですnullを許可する型を実装する理由(これは非常に単純だと(私のニーズから))、Boost :: Optionalなどのモンスターが必要です。
そして、私のニーズは次のとおりです(すぐに例としてnullable自転車を使用しています):
class FooModel { public: NullableType<int> intParam; }; FooModel* model = new FooModel(); // , - nullable- NULL bool resBool = model->intParam == nullptr; // NULL model->intParam = 654; // “ ” . resBool = model->intParam == nullptr; // “ ” NULL, NullableType<int> globIntParam1 = model->intParam; // , int* intVarPtr1 = new int(23); // C- int* intVarPtr2 = NULL; model->intParam = intVarPtr1; // model->intParam = intVarPtr2; // . ( , ) NullableType<int> globIntParam2(intVarPtr); //
組み込みの単純なC型の単純なラッパーが必要ですか?それらにintのようなNULL値を割り当てることができますか? またはダブル? C#では、何もnull化するサポートはありません。 (念のため、C ++ 11以降の機能を使用することについて話をすることはできません)。 少しグーグルで、似たような実装をいくつか見つけましたが、必要なすべての機能が不足していることに混乱し、nullableラッパーの独自の実装を作成しました。
私が正しいなら、多くのC ++プロジェクトで同様のものが必要です。 したがって、Googleがまだこの問題について簡単な解決策を提供していないとは考えにくいです。
私のラッパーには問題があります-それは文字列で考えずに使用することはできません、なぜなら NULL値で「ラップ」された文字列を初期化するときは、文字列に変換するときにNULLから空の文字列を取得できるように、何らかの方法でそれを作成する必要があります。 ソースへのコメントには簡単な修正オプションがあります(gccとclangでチェックされ、すべては問題ありません)が、誰もがそれを気に入るとは限りません。 また、通常の文字列の代わりに使用されるCStringのサポートを追加することで、MFCのこの問題をプライベートに解決することもできますが、MFCにバインドしないようにこれをしませんでしたが、これまではNULL値を書き込む必要はありませんでした空の文字列ではなく、データベース内。
さまざまな提案や批判をしますが、多分、この問題の既成の簡単な解決策を見つけるのに十分な努力をしなかったでしょう。
説明されているヌル可能クラスのソースコードはこちらです。