回答編集履歴
2
conditional_t を使ってみた話を追記
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
文言修正,文章配置を変える
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
|
-
|
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
|
+
|