回答編集履歴
4
細かい表記の修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
`std::string`から`std::map<int, std::string>`を導くのは不可能です。
|
88
88
|
|
89
|
-
std::map<int, std::string>という完全型名がわかれば, key_type=int, mapped_type=std::stringが導けます。
|
89
|
+
std::map<int, std::string>という完全な型名がわかれば, key_type=int, mapped_type=std::stringが導けます。
|
90
90
|
|
91
91
|
つまりkey_type, mapped_typeはstd::mapに依存した型名であり**依存型名**と呼ばれるのはこのためです。
|
92
92
|
|
@@ -96,7 +96,7 @@
|
|
96
96
|
|
97
97
|
|
98
98
|
|
99
|
-
第一引数から`std::map<T1, T2>`を推論し、第二引数の依存型を決定するのです。
|
99
|
+
第一引数から`std::map<T1, T2>`を推論し、第二引数の依存型名を決定するのです。
|
100
100
|
|
101
101
|
|
102
102
|
|
3
追記のミスを修正
test
CHANGED
@@ -122,4 +122,4 @@
|
|
122
122
|
|
123
123
|
|
124
124
|
|
125
|
-
と書いたのではT1が別々に推論されるため
|
125
|
+
と書いたのではT1が別々に推論されるためkeyがT1に変換可能であっても型が合わなければコンパイルエラーとなってしまいます。
|
2
詳しい原理について追記
test
CHANGED
@@ -53,3 +53,73 @@
|
|
53
53
|
|
54
54
|
|
55
55
|
[実行結果|Wandbox](https://wandbox.org/permlink/SWGq55eriRQgpRxQ)
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
**追記**
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
この原理は少々複雑です。
|
64
|
+
|
65
|
+
型推論について言及する必要があります。
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
まず以下のような型を**依存型名**といいます
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
```cpp
|
74
|
+
|
75
|
+
typename std::map<int, std::string>::key_type // int
|
76
|
+
|
77
|
+
typename std::map<int, std::string>::mapped_type // std::string
|
78
|
+
|
79
|
+
```
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
これは型推論できないタイプの型です。
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
`std::string`から`std::map<int, std::string>`を導くのは不可能です。
|
88
|
+
|
89
|
+
std::map<int, std::string>という完全型名がわかれば, key_type=int, mapped_type=std::stringが導けます。
|
90
|
+
|
91
|
+
つまりkey_type, mapped_typeはstd::mapに依存した型名であり**依存型名**と呼ばれるのはこのためです。
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
このテクニックのキモは依存型名が推論の対象から外れるというところです。
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
第一引数から`std::map<T1, T2>`を推論し、第二引数の依存型を決定するのです。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
こうすることによって第二引数は依存型名に固定されるのです。
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
```cpp
|
108
|
+
|
109
|
+
//template あり
|
110
|
+
|
111
|
+
template <typename T1, typename T2>
|
112
|
+
|
113
|
+
bool map_func1(const std::map<T1, T2> &m, T1 key)
|
114
|
+
|
115
|
+
{
|
116
|
+
|
117
|
+
return true;
|
118
|
+
|
119
|
+
}
|
120
|
+
|
121
|
+
```
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
と書いたのではT1が別々に推論されるため第二引数がT2に変換可能であっても型が合わなければコンパイルエラーとなってしまいます。
|
1
実行結果を追加
test
CHANGED
@@ -49,3 +49,7 @@
|
|
49
49
|
|
50
50
|
|
51
51
|
とすることにより、第一引数の推論から第二引数の型を`key_type`に固定することができます。
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
[実行結果|Wandbox](https://wandbox.org/permlink/SWGq55eriRQgpRxQ)
|