詳しく知っている、もしくは向上心があって知らないことを学習の機会とみなしてくれる人であるという恵まれたプロジェクトであったらどんなものを作るか考えてみます。スカラー値のみを扱う。keyは殆どの場合予め定められたものを使用する、プログラムでキーを生成して格納するという用途でも使用できるべきだが、そのような用法は優先しない。文字列を扱う仕組みがすでにできている。あらゆる文字列を扱うことができるようになっている。(エスケープなどはここでは考えない)同期については考えない。前提があるものとします。Property::GetBool();これは(ごく平均的なプログラマにとって)非常にわかりやすいのですが、ちょっと拡張性がよろしくないです。あらゆる型を受け取ろうとすると、無限に関数を書かなくてはいけません。いうことで、それを解決しようとするとこうなります。特殊化して対応可能になりました。問題はこれで解決です。FASLE(FALSEのまちがい)問題もこれで対応可能です。・・・』とか、考えたくもないことで、『何も考えずにキーを渡したら値が返ってくる』という使用方法をしたいはずです。これを解決するのが、デフォルト値の問題です。視野を広げて、そういう『何も考えずにキーを渡したら値が返ってくる』というものが欲しいプログラマが、キーを文字列で直接指定するのは(スペリングミスとかもあるし)あまり良さそうなことではないです。いう人には予め何らかのキー定数を用意してもらうべきでしょう。そのような定数があるのなら、その定数の中にデフォルト値の情報をぶち込んでしまうこともできそうです。同じキーを別の型で取り出す、ということはアプリケーションの実装であまりありそうなことではないので、キー定数にはそのキーの値がどんな型で取り出されるべきかもついでに含ませてしまいましょう。持たせてあげたいのですが、このキーはグローバル変数になってしまうため、含まれる型がわからないと初期化がよくわからないことになってしまいそうです。リンケージにしてしまいましょう。デフォルト値を文字列で持ってしまうとお目当ての型に変換できない時わけがわからなくなりますが、それはあからさまなコーディングミスなので無視することとします。実行時効率としてはいろいろ妥協してますが、この選択によってキーを追加するときは一行追加するだけですむことになりました、また、グローバルオブジェクトの初期化で使用されたとしても問題なくなりました。プロジェクト全体から見える位置にそれを置くことにしましょう。(この選択は『デフォルト値を変えたら関連するコンパイル単位全部コンパイルしなおし』ということを受け入れるという選択でもあります。して、宣言も一箇所にまとめずそれぞれのモジュールで使いたい分だけそれぞれ宣言するようにしたほうがいいかもしれません。