ユーティリティークラスQuantLibでは、金融に関する概念以外の概念も、いくつかのクラスや関数によってオブジェクトモデル化されています。これらは、ライブラリー全体の土台を築くのに使われるボルトやナットのような役割をしています。その内のいくつかについて、このセクションで説明します。Heapメモリー上に領域を割り当てられています。この事は、メモリー管理の問題を発生させます。開発者自身で管理する必要があります。メモリー管理に関しては、殆どが過去の問題で、現時点で多くの問題が残っている訳ではありません。この問題への対応はやっかいなので(特に、例外処理が発生した場合)、マニュアル管理ではなく、できるだけ自動的にできるような方法を探してきました。開発者にとって、この問題と戦う為の最善の武器は、スマートポインターです。備え付けのポインターと同じ機能を持つと同時に、ポインターが指し示すオブジェクト用に、メモリーの生成や維持管理を行い、また不要になれば破棄するという動作まで行っています。標準ライブラリーにも含まれています)。Boostライブラリーの文書を見て下さい。QuantLibは、このスマートポインターを使う事により、メモリー管理が完全に自動化されているという点だけ述べておきます。“ポインターへのポインター”も、スマートポインターと同じ様な機能(訳注:メモリーの領域取得と破棄を自動的に行う機能)をするクラスを使って用意しています(“ポインターへのポインター”について再確認したい方は、このセクションの最後のAsideをご覧下さい)。我々は、単にスマートポインターへのスマートポインターを使うような選択をしませんでした。UNIX環境のプログラマーに人気のテキストエディタで、キーボード操作だけで素早くプログラムを書ける)を使ったとしても、長たらしいコードを書くのは面倒です。>また、この構文の中の内側のポインターは、動的に配分される必要がありますが、あまり気持ちよくありません。Observerパターンを実装するのが難しくなります。そこで、QuantLibでは、Handleというクラステンプレートを用意しています。メンバー変数に持つ“Link”という介在役の内部クラスを利用しています。この変数がポインターのポインターに該当)、かつそれを使いやすくするためのメソッド群を用意しています。Handleインスタンスに自動的に反映されます。Handleクラスは、shared_ptr<Link<Type>>型の変数によって、他のクラスのObservableとなる機能も与えられています。Observerに転送する機能を持ちます。Observerに通知します。)オペレーターの自動型変換を定義する事によって実現しています。従って、次のような宣言は構文上許されており、期待通りの動作をします。Observerは、Linkインスタンスと(間接的に)それが指し示すオブジェクトから通知を受ける事になります。RelinkableHandleクラスに与えられている点に気づかれたでしょうか。Handleがその機能を使えないようにするかについて、間違えないようにする為です。Handleインスタンスのコピーが保存され、使用されます。Handleインスタンスにアクセスできるようにしている場合には、その外からのアクセス元にも同様)。仮にそうしてしまうと、他のオブジェクトにひどい影響を与える可能性があります。(注:そういった影響は、思ったよりも頻繁に起こり得ます。Handleとでも呼びましょうか)からのみ、変更が許されるべきなのです。人間にその管理を任せると間違いを起こしやすいので、我々は、それをコンパイラーに強制させるようにしました。返すような方法では、機能しません。コピーが、簡単に作れてしまうからです。(訳注:再リンクの機能を、RelinkableHandleクラスという特別な派生クラスにのみ許可している)。ある型変換の仕組みを使えば、これでうまくいきます。役割を持つインスタンスを、RelinkableHandleクラスを使って生成します。そのインスタンスを、同じポイント先のデータを必要とする他のオブジェクトに渡します。Handleインスタンスのコピーを受け取ります。Down-Castする方法はありません。>あるクラスのインスタンスがポインターのコピーを保持する場合、そのインスタンスはポインターが指し示す先の現在の値にアクセスする事ができます。次のコードを見て下さい。43しかし、インスタンスの変数に代入されたポインターは、もともと当初のポインターのコピーになりますが、その当初のポインターがインスタンスの外で変更されたとしても、クラスインスタンスに保持されているポインターはその影響を受けません。42通常、これの解決策は、間接的アクセスをもう一段階加える事です。Fooクラスを修正して、ポインターのポインターを格納するようにすると、以下のように、上記2種類の変更の両方に対応可能です。例外処理QuantLibライブラリーの中には、入力値の条件チェックを行うべき場所が至る所にあります。range");という風にやるのでは無く、次の構文のようにチェックの意図がより明確に解るような方法を取りたいと考えました。range");この構文であれば、条件が満たされない事をチェックするのではなく条件が満たされる事を要求するような表現になります。assertという単語を使って、チェックの意図(入力値のチェックなのか、出力値のチェックなのか、プログラムのエラーチェックなのか)が解るようなプログラムコードが書けます。syntax(構文)を、マクロを使って提供しています。読者の方が“そんなの止めてくれ”と言っているのが聞こえます。その通り、マクロは良くないと思われているし、実際にこれによって若干の問題も発生しています。それについては下記で説明します。この場合は、関数を使う方がより大きなデメリットをもたらします。関数は、すべての引数を評価するからです。次のような、やや複雑な例外処理のメッセージを生成する場合が多々あります。)が関数であるなら、(2つめの引数である)メッセージの部分は、条件が満たされようが無かろうが、必ず生成されます。すると、場合によっては許容できないほどのパフォーマンス悪化をもたらします。同じ構文をマクロで作ると、マクロの部分は実際には次のような構文で置き換えられます。range");こうすれば、例外処理のメッセージは、条件が満たされなかった場合のみ生成されます。現バージョンを示しています。その他のマクロも同じ様に定義されています。elseこの定義の方法を使えば、エラー時に、さらにいくつかの警告メッセージが出されます。)を使っているので、次のような構文が使えます。range");(この方法がどのように動作するか理解する為に、マクロの本体を一部修正して動作確認してみて下さい。とファイル名が渡されます。コンパイル時のフラッグ設定によりますが、この情報もエラーメッセージの中に含める事が可能で、プログラマーの問題発見の参考になります。QuantLibライブラリーでのデフォールトの設定は、ユーザーにとっての便益があまり無いので、この情報をメッセージに含めないようになっています。付いているか疑問に思うでしょう。欠如と呼ばれています。else以下は、次のように何らかのプログラムコードを追加する必要があります。含まれていなかったとすると、上記のコードは意図した通りに動作しません。組み合わされ、次のようなコードが書かれたと解釈されてしまいます。}これは、意図した動作ではありません。最後の注意点として、これらのマクロの不利益な点についても説明しなければなりません。現状のマクロの記述では、例外処理に飛ぶと、引数に含まれているメッセージしか返す事が出来ません。その他のチェックすべきデータのインスペクター関数が全く定義されていません。して返すメソッドがありません。Displayで見る事は出来ますが、例外処理後にエラーをリカバリーするプログラムコードの中で使う事が出来ません。だれかがメッセージからその情報を切り取る以外は。そのメリットはそのコードを書く手間に見合いません。従って、今の所、解決策はありません。読者の中で良いアイデアをお持ちなら、そのコードを送って下さい。実現する為の試みでした。そのアイデアを提唱した人の功績を称える為、そのアイデアを取ってきた原典を紹介します。)で、そこでは、関数が値を返す際に一時的に生成されるオブジェクトのコピーを省略する方法を提示しました。正式に取り入れられました。一時的に生成されたオブジェクト(右辺値)を、他のオブジェクト(左辺値)にコピーする場合、場合によっては、その一時オブジェクトを代入先と交換する方が、プロセス効率が上がる場合があります。新しい配列変数を作って、一時的な配列変数が示すPointee(配列の中身)の先頭アドレスをコピーする方が、配列変数の要素をすべてコピーするより早いですよね。)コンパイラーは、一時的に生成されるオブジェクトの生成消去のタイミングが分っています。使って、一時的に生成されたオブジェクトを、別のオブジェクトに移す事ができます。あるように、そのようなコンパイラーのサポートを使わずに実現しようとするものです。その結果どうなったか、すぐ後に説明します。};このクラスそのものに、あまり注目すべき所はありません。)メソッドを実装する際に使われるテンプレート引数に依存します。このメソッドを使って、引数のインスタンスの中に含まれるデータを(望むべくは効率よく)コピーではなく、スワップします。)メソッドを使って、インスタンスの中のデータを、コピーせずに新しいオブジェクトに移動させます。Disposableインスタンスを使って構築する場合は、const参照を使って、構築元のオブジェクトを受取ります。Disposableオブジェクトの殆どは、一時変数です)。