質問編集履歴

6

コメント追加

2015/12/15 07:58

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -140,7 +140,7 @@
140
140
 
141
141
  // privateな定義
142
142
 
143
- }}
143
+ }} // (←この2重かっこが見難くて悔しい)
144
144
 
145
145
 
146
146
 

5

例を修正

2015/12/15 07:58

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -128,25 +128,37 @@
128
128
 
129
129
  ```C++
130
130
 
131
- namespace myLib { namespace {
131
+ namespace myLib
132
132
 
133
+ {
134
+
135
+ namespace prv_impl {};
136
+
137
+ namespace { namespace prv_impl
138
+
139
+ {
140
+
133
- // ここで外部公開クラスや関数定義
141
+ // privateな定義
142
+
143
+ }}
134
144
 
135
145
 
136
146
 
137
- namespace prv_impl {
147
+ namespace
138
148
 
149
+ {
150
+
139
- // ここで非公開内部クラスや関数定義
151
+ // publicな定義
140
152
 
141
153
  }
142
154
 
143
- }}
155
+ }
144
156
 
145
157
  ```
146
158
 
147
159
 
148
160
 
149
- 一瞬外部公開クラスを使えないようにも見える点に少し問題ありますが、使っても良さそうな気がします。
161
+ 一瞬外部公開クラスを使えないようにも見える点に少し問題ありますが、使っても良さそうな気がします。
150
162
 
151
163
 
152
164
 

4

補足

2015/12/15 07:57

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,10 @@
98
98
 
99
99
  ```
100
100
 
101
+ ---
102
+
103
+ (引用終わり)
104
+
101
105
 
102
106
 
103
107
  > namespace prv_impl {}; // 実装が書いてある方のprv_implへのアクセス殺し。

3

追記

2015/12/15 06:11

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -45,3 +45,105 @@
45
45
  **④**ヘッダの最後で内部名前空間名を#defineする。
46
46
 
47
47
  解りやすくてよいけど、インクルード群の「最後」を決めることができないので使えない。
48
+
49
+
50
+
51
+ ---
52
+
53
+ 【②を検証】
54
+
55
+ http://tiri-tomato.hatenadiary.jp/entry/20130209/1360357831
56
+
57
+ に記載されている方法を確認しました。びっくりですが使えそうな感じがします。
58
+
59
+
60
+
61
+ 以下、上記ページから引用です。
62
+
63
+ ```C++
64
+
65
+ namespace myLib {
66
+
67
+ namespace {
68
+
69
+ // privateな実装
70
+
71
+ namespace prv_impl {
72
+
73
+ void hoge_impl() { /* ほにゃらら */ }
74
+
75
+ }
76
+
77
+ // publicな定義
78
+
79
+ void hoge() { prv_impl::hoge_impl(); }
80
+
81
+ }
82
+
83
+ namespace prv_impl {}; // 実装が書いてある方のprv_implへのアクセス殺し。
84
+
85
+ }
86
+
87
+ ```
88
+
89
+ ```C++
90
+
91
+ void func() {
92
+
93
+ myLib::hoge(); // これはOK。
94
+
95
+ // でも myLib::prv_impl::hoge_impl(); はNG!
96
+
97
+ }
98
+
99
+ ```
100
+
101
+
102
+
103
+ > namespace prv_impl {}; // 実装が書いてある方のprv_implへのアクセス殺し。
104
+
105
+
106
+
107
+ を書く場所が気になったのですが、namespace myLibの先頭へ移動しても意図通りでした。
108
+
109
+ また、msvc2015, MinGW 4.9.2, MinGW 5.2.0全てで、
110
+
111
+ 1) myLib内の無名namespaceから、hoge_impl()をアクセス可
112
+
113
+ 2) myLib外部からは、hoge_impl()はundefined symbol
114
+
115
+ 3) myLib直下からは、hoge_impl()するとprv_implが曖昧
116
+
117
+ となりました。
118
+
119
+
120
+
121
+ 文法的にも問題ないように感じますので、使えそうな気がします。
122
+
123
+
124
+
125
+ ```C++
126
+
127
+ namespace myLib { namespace {
128
+
129
+ // ここで外部公開クラスや関数定義
130
+
131
+
132
+
133
+ namespace prv_impl {
134
+
135
+ // ここで非公開な内部クラスや関数定義
136
+
137
+ }
138
+
139
+ }}
140
+
141
+ ```
142
+
143
+
144
+
145
+ 一瞬外部公開クラスを使えないようにも見える点に少し問題ありますが、使っても良さそうな気がします。
146
+
147
+
148
+
149
+ 皆さんはどう思いますか?(それと、これは別質問にするべきですか?)

2

追記

2015/12/15 06:09

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -7,3 +7,41 @@
7
7
 
8
8
 
9
9
  必須要件ではないし、C++言語仕様上無理っぽい気がするので諦める方向なのですが、もし、何か使えそうなテクニックをご存知の方がいれば、ぜひ教えて下さい。
10
+
11
+
12
+
13
+ ---
14
+
15
+ 【追記】
16
+
17
+ privateな名前空間だよなと思いつつ、流石にあり得ないので検索することに思い至って無かったのですが、検索してみたらいくつか当たりました!
18
+
19
+ http://tiri-tomato.hatenadiary.jp/entry/20130209/1360357831
20
+
21
+ http://oshiete.goo.ne.jp/qa/6902744.html
22
+
23
+
24
+
25
+ catsforepawさんの回答も含めて今のところ下記方法が考えられそうです。
26
+
27
+
28
+
29
+ **①**内部用の名前空間をわけ、長い名前をつけてて使い難くする。
30
+
31
+
32
+
33
+ **②**無名名前空間を途中にかまして、使えなくする。
34
+
35
+ ただし、上書きするための名前空間定義の場所が気になる。最後にしないとダメかも? 後ほど確認予定。
36
+
37
+
38
+
39
+ **③**全部privateなclass内に定義し、friend指定する。
40
+
41
+ 異なる場所で内部クラスを定義する度にclassを別に定義する必要があるし、クラス内クラス・テンプレートは結構面倒なので、手間がかかりそう。
42
+
43
+
44
+
45
+ **④**ヘッダの最後で内部名前空間名を#defineする。
46
+
47
+ 解りやすくてよいけど、インクルード群の「最後」を決めることができないので使えない。

1

pImplイデオムへの言及を削除

2015/12/15 05:36

投稿

Chironian
Chironian

スコア23272

test CHANGED
File without changes
test CHANGED
@@ -4,8 +4,6 @@
4
4
 
5
5
  内部的なクラス・テンプレートが多数あるのですが、混乱を招くだけなのでこれらをユーザに使わせたくないのです。普通にドキュメントで説明しないだけでも一定の効果はあると思いますが、可能であれば「使えない」、もしくは、「使いにくく」したいと考えてます。
6
6
 
7
- しかし、明示的実体化できないクラス・テンプレートなのでpImplイデオムでは隠せないと思います。
8
-
9
7
 
10
8
 
11
9
  必須要件ではないし、C++言語仕様上無理っぽい気がするので諦める方向なのですが、もし、何か使えそうなテクニックをご存知の方がいれば、ぜひ教えて下さい。