回答編集履歴
4
別解
test
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
1
|
+
~~`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。~~
|
2
2
|
|
3
3
|
|
4
4
|
|
5
5
|
追記: ↑そんなことはないようです。`std::numeric_limits<>` はどんな型にも動きます。
|
6
|
+
|
7
|
+
原因は、`first`と`last`の両方を`enable_if<>::type`にしてしまうと、`InputIterator`に何の型を当てはめるか決められなくなるためで、どちらかの`enable_if<>`をやめればよいです。
|
6
8
|
|
7
9
|
|
8
10
|
|
3
std::numeric_limits について追記
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
-
`std::numeric_limits<
|
1
|
+
`std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
追記: ↑そんなことはないようです。`std::numeric_limits<>` はどんな型にも動きます。
|
2
6
|
|
3
7
|
|
4
8
|
|
2
コードにコメント追加
test
CHANGED
@@ -2,17 +2,21 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ターゲット環境に`std::iterator_traits<>`があればそれで判定し
|
5
|
+
ターゲット環境に`std::iterator_traits<>`があればそれで判定するのはいかがでしょうか。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
6
6
|
|
7
7
|
```c++
|
8
8
|
|
9
|
+
// イテレータをデリファレンスした型がvectorのvalue_typeと等しいならOK。
|
10
|
+
|
9
11
|
// std::is_same<> はC++11からなので、ft:is_same<> を実装する
|
10
12
|
|
11
|
-
typename ft::enable_if<
|
13
|
+
typename ft::enable_if<
|
12
14
|
|
13
|
-
|
15
|
+
ft::is_same<std::iterator_traits<InputIterator>::value_type,
|
14
16
|
|
17
|
+
value_type>::value,
|
18
|
+
|
15
|
-
|
19
|
+
InputIterator>::type first,
|
16
20
|
|
17
21
|
```
|
18
22
|
|
1
修正案を追加
test
CHANGED
@@ -2,4 +2,18 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。
|
5
|
+
ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。`std::iterator_traits<>`がある場合、range constructor のパラメータは
|
6
|
+
|
7
|
+
```c++
|
8
|
+
|
9
|
+
// std::is_same<> はC++11からなので、ft:is_same<> を実装する
|
10
|
+
|
11
|
+
typename ft::enable_if<ft::is_same<std::iterator_traits<InputIterator>::value_type,
|
12
|
+
|
13
|
+
value_type>::value,
|
14
|
+
|
15
|
+
InputIterator>::type first,
|
16
|
+
|
17
|
+
```
|
18
|
+
|
19
|
+
です。fill constructor に `enable_if<>` は必要ありません。
|