回答編集履歴

4

別解

2021/01/15 06:45

投稿

int32_t
int32_t

スコア20923

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 について追記

2021/01/15 06:45

投稿

int32_t
int32_t

スコア20923

test CHANGED
@@ -1,4 +1,8 @@
1
- `std::numeric_limits<char[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
1
+ `std::numeric_limits<int[]>` が存在しないから、 両方のvectorコンストラクタがエラーになりマッチしないのではないでしょうか。
2
+
3
+
4
+
5
+ 追記: ↑そんなことはないようです。`std::numeric_limits<>` はどんな型にも動きます。
2
6
 
3
7
 
4
8
 

2

コードにコメント追加

2021/01/15 05:43

投稿

int32_t
int32_t

スコア20923

test CHANGED
@@ -2,17 +2,21 @@
2
2
 
3
3
 
4
4
 
5
- ターゲット環境に`std::iterator_traits<>`があればそれで判定しましょう。`std::iterator_traits<>`がある場合、range constructor のパラメータは
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<ft::is_same<std::iterator_traits<InputIterator>::value_type,
13
+ typename ft::enable_if<
12
14
 
13
- value_type>::value,
15
+ ft::is_same<std::iterator_traits<InputIterator>::value_type,
14
16
 
17
+ value_type>::value,
18
+
15
- InputIterator>::type first,
19
+ InputIterator>::type first,
16
20
 
17
21
  ```
18
22
 

1

修正案を追加

2021/01/15 05:13

投稿

int32_t
int32_t

スコア20923

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<>` は必要ありません。