teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コードの修正

2020/02/01 10:05

投稿

alphya
alphya

スコア124

answer CHANGED
@@ -14,6 +14,10 @@
14
14
  template <typename... T>
15
15
  struct dependent_false { static constexpr bool value = false; };
16
16
 
17
+ // オーバーロードの優先順位の制御のため
18
+ template <int I> struct rank : rank<I-1> {};
19
+ template <> struct rank<0> {};
20
+
17
21
  template<
18
22
  typename... T,
19
23
  typename std::enable_if<
@@ -21,7 +25,7 @@
21
25
  std::nullptr_t
22
26
  >::type = nullptr
23
27
  >
24
- void func(T... t) {
28
+ void func_impl(rank<1>, T...) {
25
29
  std::cout << "整数だよ" << std::endl;
26
30
  }
27
31
 
@@ -33,14 +37,19 @@
33
37
  std::nullptr_t
34
38
  >::type = nullptr
35
39
  >
36
- void func(T...) {
40
+ void func_impl(rank<1>, T...) {
37
41
  std::cout << "整数じゃないよ" << std::endl;
38
42
  }
39
43
 
40
44
  template<typename... T>
41
- void func(T...) {
45
+ void func_impl(rank<0>, T...) {
42
46
  static_assert(dependent_false<T...>::value, "Error!");
43
47
  }
48
+
49
+ template <typename... T>
50
+ void func(T&&... t) {
51
+ func_impl(rank<1>{}, std::forward<T>(t)...);
52
+ }
44
53
  ```
45
54
 
46
55
  補足:

2

コンパイル時エラーになるようにしたしょりの修正

2020/02/01 10:05

投稿

alphya
alphya

スコア124

answer CHANGED
@@ -10,6 +10,10 @@
10
10
  #include <boost/mpl/and.hpp>
11
11
  #include <boost/mpl/not.hpp>
12
12
 
13
+ // static_assert が常に評価されることを防ぐ
14
+ template <typename... T>
15
+ struct dependent_false { static constexpr bool value = false; };
16
+
13
17
  template<
14
18
  typename... T,
15
19
  typename std::enable_if<
@@ -29,14 +33,13 @@
29
33
  std::nullptr_t
30
34
  >::type = nullptr
31
35
  >
32
- void func(T... t) {
36
+ void func(T...) {
33
37
  std::cout << "整数じゃないよ" << std::endl;
34
38
  }
35
39
 
36
- template<typename F, typename S, typename... T>
40
+ template<typename... T>
37
- void func(F f, S s, T... t)
41
+ void func(T...) {
38
- {
39
- static_assert(std::is_same<F, S>::value, "Error!");
42
+ static_assert(dependent_false<T...>::value, "Error!");
40
43
  }
41
44
  ```
42
45
 

1

コンパイル時エラーになるようにした

2020/02/01 09:28

投稿

alphya
alphya

スコア124

answer CHANGED
@@ -33,9 +33,10 @@
33
33
  std::cout << "整数じゃないよ" << std::endl;
34
34
  }
35
35
 
36
- template<typename... T>
36
+ template<typename F, typename S, typename... T>
37
- void func(T... t) {
37
+ void func(F f, S s, T... t)
38
+ {
38
- std::cout << "エラー" << std::endl;
39
+ static_assert(std::is_same<F, S>::value, "Error!");
39
40
  }
40
41
  ```
41
42