回答編集履歴

2

微修正

2020/06/28 16:52

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
 
94
94
 
95
- 上記回答の前に実はラムダ式を使わないバージョンを作っていたのですが、そちらは通りました。
95
+ 上記回答の前に実はinlineとラムダ式を使わないバージョンを作っていたのですが、そちらは通りました。
96
96
 
97
97
 
98
98
 

1

追記

2020/06/28 16:51

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -79,3 +79,125 @@
79
79
  ```
80
80
 
81
81
  [wandbox](https://wandbox.org/permlink/ScKsyrW5YcGQeICV)
82
+
83
+
84
+
85
+
86
+
87
+ -----
88
+
89
+ 【コメントを見て追記】
90
+
91
+ 試しに VC++ 2017で上記ソースをコンパイルしてみたら、おっしゃる通りのエラーがでました。
92
+
93
+
94
+
95
+ 上記回答の前に実はラムダ式を使わないバージョンを作っていたのですが、そちらは通りました。
96
+
97
+
98
+
99
+ ```C++
100
+
101
+ #include <iostream>
102
+
103
+ #include <vector>
104
+
105
+
106
+
107
+ template<class Derived>
108
+
109
+ class Base {
110
+
111
+ private:
112
+
113
+ static const std::vector<const char*> paths;
114
+
115
+
116
+
117
+ static std::vector<const char*> init()
118
+
119
+ {
120
+
121
+ std::cout << "init()\n";
122
+
123
+ std::vector<const char*> paths;
124
+
125
+
126
+
127
+ // Derived::path がディレクトリ、path がその中のファイルとする。疑似コード。
128
+
129
+ paths.push_back(Derived::path);
130
+
131
+ paths.push_back(Derived::path);
132
+
133
+ paths.push_back(Derived::path);
134
+
135
+
136
+
137
+ return paths;
138
+
139
+ }
140
+
141
+ protected:
142
+
143
+ const std::vector<const char*> getPaths() const { return paths; }
144
+
145
+ };
146
+
147
+
148
+
149
+ template<class Derived>
150
+
151
+ const std::vector<const char*> Base<Derived>::paths=Base<Derived>::init();
152
+
153
+
154
+
155
+ class Derived : public Base<Derived> {
156
+
157
+ friend class Base<Derived>;
158
+
159
+ private:
160
+
161
+ static constexpr const char *path = "どこかのディレクトリへのパス";
162
+
163
+ public:
164
+
165
+ void print()
166
+
167
+ {
168
+
169
+ for (auto const* p : getPaths())
170
+
171
+ {
172
+
173
+ std::cout << p << "\n";
174
+
175
+ }
176
+
177
+ }
178
+
179
+ };
180
+
181
+
182
+
183
+ int main()
184
+
185
+ {
186
+
187
+ std::cout << "main()\n";
188
+
189
+ Derived derived;
190
+
191
+ derived.print();
192
+
193
+ }
194
+
195
+ ```
196
+
197
+ [wandbox](https://wandbox.org/permlink/J3SZWBOxc4bGotgh)
198
+
199
+
200
+
201
+ init()はmain()の前に走っていますが、たまたまかも知れません。
202
+
203
+ ただ、確かboostは、使っているように見せかけることでmain()より前に走らせていましたので、もしかするとある程度は当てにして良いかもしれません。