回答編集履歴

3

コードの修正

2020/02/01 10:05

投稿

alphya
alphya

スコア124

test CHANGED
@@ -30,6 +30,14 @@
30
30
 
31
31
 
32
32
 
33
+ // オーバーロードの優先順位の制御のため
34
+
35
+ template <int I> struct rank : rank<I-1> {};
36
+
37
+ template <> struct rank<0> {};
38
+
39
+
40
+
33
41
  template<
34
42
 
35
43
  typename... T,
@@ -44,7 +52,7 @@
44
52
 
45
53
  >
46
54
 
47
- void func(T... t) {
55
+ void func_impl(rank<1>, T...) {
48
56
 
49
57
  std::cout << "整数だよ" << std::endl;
50
58
 
@@ -68,7 +76,7 @@
68
76
 
69
77
  >
70
78
 
71
- void func(T...) {
79
+ void func_impl(rank<1>, T...) {
72
80
 
73
81
  std::cout << "整数じゃないよ" << std::endl;
74
82
 
@@ -78,9 +86,19 @@
78
86
 
79
87
  template<typename... T>
80
88
 
81
- void func(T...) {
89
+ void func_impl(rank<0>, T...) {
82
90
 
83
91
  static_assert(dependent_false<T...>::value, "Error!");
92
+
93
+ }
94
+
95
+
96
+
97
+ template <typename... T>
98
+
99
+ void func(T&&... t) {
100
+
101
+ func_impl(rank<1>{}, std::forward<T>(t)...);
84
102
 
85
103
  }
86
104
 

2

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

2020/02/01 10:05

投稿

alphya
alphya

スコア124

test CHANGED
@@ -19,6 +19,14 @@
19
19
  #include <boost/mpl/and.hpp>
20
20
 
21
21
  #include <boost/mpl/not.hpp>
22
+
23
+
24
+
25
+ // static_assert が常に評価されることを防ぐ
26
+
27
+ template <typename... T>
28
+
29
+ struct dependent_false { static constexpr bool value = false; };
22
30
 
23
31
 
24
32
 
@@ -60,7 +68,7 @@
60
68
 
61
69
  >
62
70
 
63
- void func(T... t) {
71
+ void func(T...) {
64
72
 
65
73
  std::cout << "整数じゃないよ" << std::endl;
66
74
 
@@ -68,13 +76,11 @@
68
76
 
69
77
 
70
78
 
71
- template<typename F, typename S, typename... T>
79
+ template<typename... T>
72
80
 
73
- void func(F f, S s, T... t)
81
+ void func(T...) {
74
82
 
75
- {
76
-
77
- static_assert(std::is_same<F, S>::value, "Error!");
83
+ static_assert(dependent_false<T...>::value, "Error!");
78
84
 
79
85
  }
80
86
 

1

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

2020/02/01 09:28

投稿

alphya
alphya

スコア124

test CHANGED
@@ -68,11 +68,13 @@
68
68
 
69
69
 
70
70
 
71
- template<typename... T>
71
+ template<typename F, typename S, typename... T>
72
72
 
73
- void func(T... t) {
73
+ void func(F f, S s, T... t)
74
74
 
75
+ {
76
+
75
- std::cout << "エラー" << std::endl;
77
+ static_assert(std::is_same<F, S>::value, "Error!");
76
78
 
77
79
  }
78
80