回答編集履歴

2

conditional_t を使ってみた話を追記

2022/10/12 05:38

投稿

fana
fana

スコア11663

test CHANGED
@@ -112,3 +112,68 @@
112
112
  * **メンバが全部 public な型(St)** だとOK(:const オブジェクトに対しても構造化束縛したやつは const にならない).
113
113
  * **tuple** と,**tuple みたく扱えるように頑張った型(TestClass)** に関しては,VS2017だと const になってしまう(コンパイルエラーになる)が,他はOK.
114
114
 
115
+ ---
116
+
117
+ [追記]
118
+
119
+ > 型情報の分岐をお手軽に実装するなら std::conditional_t メタ関数が利用できます。(3分岐以降は面倒...)
120
+
121
+ という情報を頂いたので,チャレンジ.
122
+ 「C++ template 可変長 再帰」とかググって文法を見様見真似して四苦八苦しながら書いた.
123
+
124
+ ```C++
125
+ // conditional_t というやつを再帰的に頑張れば,
126
+ // 「書き並べた型の指定番目の型」っていうのをやれるんじゃないか? という実験.
127
+ // ググった感じ,こういうのは template の可変長のところを先頭から1個ずつ捨てていく感じで書くっぽいので,それに挑戦.
128
+ //
129
+ // TypeAt< 0, int, float > と書いたら int が,
130
+ // TypeAt< 1, int, float > と書いたら float が using された type になる,というのが目的.
131
+
132
+ //
133
+ //とりあえず TypeAt< どうのこうの >::type っていうのが存在するよ,っていうのが必要だと思うのでコレを書く.
134
+ template< size_t I, typename ...T >
135
+ struct TypeAt
136
+ {
137
+ //じゃあその type ってのは何型なんだよ?っていうと…謎だが.実際上,使わないハズだから何でもいいから書いとけばいいのかな.
138
+ using type = bool; //※ダミーでてきとーな型を書いた!
139
+ };
140
+
141
+ //コレで↑の特殊化になるとかいう謎の文法に理解が追い付かないのだが,
142
+ //何やらテンプレートで再帰を書く場合はこういう形でやるらしい.
143
+ template< size_t I, typename H, typename ...T >
144
+ struct TypeAt< I, H, T... >
145
+ {
146
+ using type = std::conditional_t< I==0, H, typename TypeAt< I-1, T... >::type >;
147
+ };
148
+
149
+ //----------
150
+ //↑を使って,TestClass 用の tuple_element を書く
151
+
152
+ namespace std
153
+ {// TestClass の構造化束縛に必要なやつ
154
+
155
+ template<>
156
+ struct tuple_size<TestClass> : integral_constant<size_t, 2> {};
157
+
158
+ #if 0 //個別に書いてたやつ
159
+
160
+ template<>
161
+ struct tuple_element<0,TestClass>{ using type=int; };
162
+
163
+ template<>
164
+ struct tuple_element<1,TestClass>{ using type=float; };
165
+
166
+ #else //TypeAt を使ってみたやつ
167
+
168
+ template< size_t I >
169
+ struct tuple_element<I,TestClass>
170
+ {
171
+ //using type = std::conditional_t< I==0, int, float >; //←コレはコメントで教えてもらったやつ
172
+ using type = typename TypeAt< I, int, float >::type;
173
+ };
174
+
175
+ #endif
176
+ }
177
+ ```
178
+
179
+

1

文言修正,文章配置を変える

2022/10/11 02:57

投稿

fana
fana

スコア11663

test CHANGED
@@ -1,8 +1,5 @@
1
- Visual Studio 2017, paiza.io に加えて,Visual Studio 2019 を試してみた(私のポンコツPCにギリ導入できたので)ところ,以下のような結果でした.
1
+ `Visual Studio 2017`, `paiza.io` に加えて,`Visual Studio 2019` を試してみた(私のポンコツPCにギリ導入できたので)ところ,以下のような結果でした.
2
-
3
- * const 配列を構造化束縛すると const になる.なので,質問コードみたいなのは無理.
4
- * メンバが全部 public な型だとOK:const オブジェクトに対しても構造化束縛したやつは const にならない.
2
+ (VS2019 でも「C++言語標準」プロパティを「ISO C++17 標準/std:c++17)」としてした)
5
- * tuple と, tuple みたく扱えるように頑張った TestClass に関しては,VS2017だと const になってしまうが,他はOK.
6
3
 
7
4
  ```C++
8
5
  #include <iostream>
@@ -111,3 +108,7 @@
111
108
  }
112
109
  ```
113
110
 
111
+ * **const 配列** を構造化束縛すると const になる.なので,質問コードみたいなのは無理.
112
+ * **メンバが全部 public な型(St)** だとOK(:const オブジェクトに対しても構造化束縛したやつは const にならない).
113
+ * **tuple** と,**tuple みたく扱えるように頑張った型(TestClass)** に関しては,VS2017だと const になってしまう(コンパイルエラーになる)が,他はOK.
114
+