C++ライブラリを開発してます。ほとんどのクラスがテンプレートです。
内部的なクラス・テンプレートが多数あるのですが、混乱を招くだけなのでこれらをユーザに使わせたくないのです。普通にドキュメントで説明しないだけでも一定の効果はあると思いますが、可能であれば「使えない」、もしくは、「使いにくく」したいと考えてます。
必須要件ではないし、C++言語仕様上無理っぽい気がするので諦める方向なのですが、もし、何か使えそうなテクニックをご存知の方がいれば、ぜひ教えて下さい。
【追記】
privateな名前空間だよなと思いつつ、流石にあり得ないので検索することに思い至って無かったのですが、検索してみたらいくつか当たりました!
http://tiri-tomato.hatenadiary.jp/entry/20130209/1360357831
http://oshiete.goo.ne.jp/qa/6902744.html
catsforepawさんの回答も含めて今のところ下記方法が考えられそうです。
①内部用の名前空間をわけ、長い名前をつけてて使い難くする。
②無名名前空間を途中にかまして、使えなくする。
ただし、上書きするための名前空間定義の場所が気になる。最後にしないとダメかも? 後ほど確認予定。
③全部privateなclass内に定義し、friend指定する。
異なる場所で内部クラスを定義する度にclassを別に定義する必要があるし、クラス内クラス・テンプレートは結構面倒なので、手間がかかりそう。
④ヘッダの最後で内部名前空間名を#defineする。
解りやすくてよいけど、インクルード群の「最後」を決めることができないので使えない。
【②を検証】
http://tiri-tomato.hatenadiary.jp/entry/20130209/1360357831
に記載されている方法を確認しました。びっくりですが使えそうな感じがします。
以下、上記ページから引用です。
C++
1namespace myLib { 2 namespace { 3 // privateな実装 4 namespace prv_impl { 5 void hoge_impl() { /* ほにゃらら */ } 6 } 7 // publicな定義 8 void hoge() { prv_impl::hoge_impl(); } 9 } 10 namespace prv_impl {}; // 実装が書いてある方のprv_implへのアクセス殺し。 11}
C++
1void func() { 2 myLib::hoge(); // これはOK。 3 // でも myLib::prv_impl::hoge_impl(); はNG! 4}
(引用終わり)
namespace prv_impl {}; // 実装が書いてある方のprv_implへのアクセス殺し。
を書く場所が気になったのですが、namespace myLibの先頭へ移動しても意図通りでした。
また、msvc2015, MinGW 4.9.2, MinGW 5.2.0全てで、
- myLib内の無名namespaceから、hoge_impl()をアクセス可
- myLib外部からは、hoge_impl()はundefined symbol
- myLib直下からは、hoge_impl()するとprv_implが曖昧
となりました。
文法的にも問題ないように感じますので、使えそうな気がします。
C++
1namespace myLib 2{ 3 namespace prv_impl {}; 4 namespace { namespace prv_impl 5 { 6 // privateな定義 7 }} // (←この2重かっこが見難くて悔しい) 8 9 namespace 10 { 11 // publicな定義 12 } 13}
一瞬外部公開クラスを使えないようにも見える点に少し問題ありますが、使っても良さそうな気がします。
皆さんはどう思いますか?(それと、これは別質問にするべきですか?)
回答4件
あなたの回答
tips
プレビュー