{睡眠}{睡眠記録}{希哲13年3月13日}{8時間睡眠}=}(4)
{希哲13年3月13日}{体調記録}{体調}=}(3)
{食事記録}{希哲13年3月13日}=}(2)
{std+.h}{希哲13年3月13日}{::xtd::}{::std::}{魔法引括}{基礎標準}{拡張標準}{xtd}{ヘッダー}{}...=}(16)

{希哲13年3月13日の開発 K#F85E/A-4686-ABFC}

昨日考案した ライブラリの分割方式を適用する前に,今後の開発の基礎になることでもあるため, の基本的なライブラリヘッダー名前空間の構成について,一日かけて熟考した。

まず,新しい着想としては,魔法引括std.h を含むことで,非標準ライブラリの読み込み前に std.h の引括をしなくて済むことに気付いた。これは有用なので採用は確定している。

ここ最近考えるようになった xtd 表記の廃止と std 表記への統合は悩みどころだった。例えば入門者用に拡張標準のような予備知識を必要とする概念を最初から導入したくない,というのも大きかったが,説明可能性を重視すると,どうしてもライブラリヘッダー名前空間での整合性を取りたかった。このうち特に難しかったのは名前空間の問題だった。std に統合するなら,Cμ 標準 も std:: で参照出来た方が良い。この場合,基礎標準との切り分けをどうするかが難しい。

例えば何らかの名前空間を作って,use ns を使って ::std:: に統合する,擬似的に std:: に見えるようにするなどの実験はいくつかしたが,名前解決が出来ない違了が出るなどしてあまり上手くいかなかった。トリッキーなことは見通しを悪くし厄介な問題を招く可能性があり避けたいこともあり,この方向は諦めた。直接 ::std:: に入れてしまうことも考えたが,基礎標準との相互運用性を考えると避けたい。さらに,基礎標準のヘッダーを引括する際,何らかの名前空間で囲って隔離するということも考えたが,これも違了で上手くいかなかった。いずれにせよ,ヘッダーの実装によっておかしくなる可能性があるので得策ではない。

結論として,::std:: はそのままにしておくことにした。

::std:: 以外の名前空間を考えると,そもそも std で統一するという方針が怪しくなってきて,kn や mus といった別の表現で統一することまで考えたが,これはこれであまり美しく感じられない。そもそもグローバル空間に展開させているので,:: でいいのではないかとも考えたが,特に C ライブラリを扱うことを考えた時に,やはり場合によって固有の名前空間は欲しい。

こうして散々考えた結果,xtd は分かりやすくて悪くないという結論に至った。基礎標準・拡張標準という Cμ の説明体系にも整合しているし,結局これが一番簡潔で分かりやすく,::xtd:: の実装も単純でよく切り分けられている。ライブラリ(libxtd.so),ヘッダー(xtd.h),名前空間で何ら問題なく整合化出来る。自分で思っていたよりよく考えられた命名だった。

結局,ドット区切りのライブラリ分割,魔法引括による std.h の自動読み込み以外はほぼ現状維持となったが,何よりの収穫は の基本方針について迷いが無くなり,確信が深まったことだった。これで気兼ねなく作業を続けることが出来る。

他に,引括や名前空間などについて熟考したことで,use ns を例えば + 記号や w/(with の意)を使って引括時に指定出来るようにする,拡張標準のヘッダーは「少なくとも一つ書けばいい」という説明の仕方にする(これまでは必ず xtd を書くことを推奨するつもりだった),という案が出来た。これらは今後検討していく。

=}
{希哲13年3月13日}{希哲13年3月13日のツイスト}{ツイスト}{C++ における名前空間}=}(4)

{あれK#F85E/A-4686-8C5B}

一つだけ微妙だったところは namespace a::b::c みたいな宣言が出来ないことだったのだが,実はこの表記にも問題があって,例えば b の下に何かを追加したい時に柔軟性が無い。一見冗長だが,入れ子表記も簡単に展開出来てそれはそれで便利だったりする。

=}
{希哲13年3月13日}{希哲13年3月13日のツイスト}{ツイスト}{名前世界}{ADL}{}{C++ における名前空間}=}(7)

{あれK#F85E/A-4686-ACCE}

C++ の名前空間って結構馬鹿にされている印象があるが,実は の基礎として C++ を選んだ時の主な理由は,名前空間や ADL も含めて大規模な名前の構造化が可能だったことがある。私が「名前世界」(nameworld)と呼んでいた網羅的な名前体系を実現出来る環境だった。

=}
{希哲13年3月13日}{希哲13年3月13日のツイスト}{ツイスト}{ミーナ}=}(4)
{希哲13年3月13日}{希哲13年3月13日のツイスト}{ツイスト}{C++ における名前空間}{C++}=}(5)

{あれK#F85E/A-4686-4CA0}

例えば,::foo::std::bar という変数があると ::foo::bar() という函数からは std::bar で参照出来る。誰が作んねんという話ではあるけど。

=}
{希哲13年3月13日}{希哲13年3月13日のツイスト}{ツイスト}{相対場筋}{C++ における名前空間}{C++}=}(6)

{あれK#F85E/A-4686-2359}

あと,久しぶりにこの辺の調べものをしていて思い出したのだが,C++std:: を前に付けたところで実は全然厳格じゃない気がする。相対場筋(パス)みたいなものなので……std という文字列自体が予約されていれば問題無いとは思うが。

=}
{希哲13年3月13日}{::xtd::}{::std::}{希哲13年3月13日のツイスト}{C++ 標準}{ツイスト}{C++ における名前空間}=}(7)

{あれK#F85E/A-4686-E677}

::std:: をあれこれ弄ろうとしたのだが,明示的に禁止されてはいないとはいえ,C++ 標準 との相互運用性等を考えるとこれは避けた方がいいだろうし,::xtd:: って意外とよく考えた命名だなと思った。

=}
{希哲13年3月13日}
{}