回答編集履歴
3
コードの修正
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
|
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
|
40
|
+
void func_impl(rank<1>, T...) {
|
37
41
|
std::cout << "整数じゃないよ" << std::endl;
|
38
42
|
}
|
39
43
|
|
40
44
|
template<typename... T>
|
41
|
-
void
|
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
コンパイル時エラーになるようにしたしょりの修正
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...
|
36
|
+
void func(T...) {
|
33
37
|
std::cout << "整数じゃないよ" << std::endl;
|
34
38
|
}
|
35
39
|
|
36
|
-
template<typename
|
40
|
+
template<typename... T>
|
37
|
-
void func(
|
41
|
+
void func(T...) {
|
38
|
-
{
|
39
|
-
|
42
|
+
static_assert(dependent_false<T...>::value, "Error!");
|
40
43
|
}
|
41
44
|
```
|
42
45
|
|
1
コンパイル時エラーになるようにした
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::
|
39
|
+
static_assert(std::is_same<F, S>::value, "Error!");
|
39
40
|
}
|
40
41
|
```
|
41
42
|
|