回答編集履歴

1

2019/01/29 15:52

投稿

yumetodo
yumetodo

スコア5850

test CHANGED
@@ -15,3 +15,83 @@
15
15
 
16
16
 
17
17
  なのでデフォルト引数を利用しているに過ぎません。
18
+
19
+
20
+
21
+ ---
22
+
23
+
24
+
25
+ 話がそれますが、`disable_if`は標準にないのでわざわざ定義する必要があり、めんdなので普通は条件式をひっくり返すか、C++17で追加された`std::negation`を使うように思います。
26
+
27
+
28
+
29
+ また`std::enable_if`の使い方ですが、
30
+
31
+ [std::enable_ifを使ってオーバーロードする時、enablerを使う?](https://qiita.com/kazatsuyu/items/203584ef4cb8b9e52462)
32
+
33
+ に紹介のあるように
34
+
35
+
36
+
37
+ ```cpp
38
+
39
+ template <class T, std::enable_if_t<std::is_class_v<T>, std::nullptr_t> = nullptr>
40
+
41
+ void check(T value)
42
+
43
+ {
44
+
45
+ std::cout << "1" << std::endl;
46
+
47
+ }
48
+
49
+ template <class T, std::enable_if_t<!std::is_class_v<T>, std::nullptr_t> = nullptr>
50
+
51
+ void check(T value)
52
+
53
+ {
54
+
55
+ std::cout << "2" << std::endl;
56
+
57
+ }
58
+
59
+ ```
60
+
61
+
62
+
63
+ のように使うことが多いです。
64
+
65
+
66
+
67
+ もっともC++17で追加された[if constexpr文](https://cpprefjp.github.io/lang/cpp17/if_constexpr.html)を使って
68
+
69
+
70
+
71
+ ```cpp
72
+
73
+ template <class T>
74
+
75
+ void check(T value)
76
+
77
+ {
78
+
79
+ if constexpr(std::is_class_v<T>){
80
+
81
+ std::cout << "1" << std::endl;
82
+
83
+ }
84
+
85
+ else {
86
+
87
+ std::cout << "2" << std::endl;
88
+
89
+ }
90
+
91
+ }
92
+
93
+ ```
94
+
95
+
96
+
97
+ とするほうがシンプルですね。