回答編集履歴

4

細かい表記の修正

2018/10/27 21:17

投稿

mitama_rs
mitama_rs

スコア165

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

追記のミスを修正

2018/10/27 21:17

投稿

mitama_rs
mitama_rs

スコア165

test CHANGED
@@ -122,4 +122,4 @@
122
122
 
123
123
 
124
124
 
125
- と書いたのではT1が別々に推論されるため第二引数がT2に変換可能であっても型が合わなければコンパイルエラーとなってしまいます。
125
+ と書いたのではT1が別々に推論されるためkeyがT1に変換可能であっても型が合わなければコンパイルエラーとなってしまいます。

2

詳しい原理について追記

2018/10/27 21:15

投稿

mitama_rs
mitama_rs

スコア165

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

実行結果を追加

2018/10/27 13:16

投稿

mitama_rs
mitama_rs

スコア165

test CHANGED
@@ -49,3 +49,7 @@
49
49
 
50
50
 
51
51
  とすることにより、第一引数の推論から第二引数の型を`key_type`に固定することができます。
52
+
53
+
54
+
55
+ [実行結果|Wandbox](https://wandbox.org/permlink/SWGq55eriRQgpRxQ)