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

回答編集履歴

1

2019/01/29 15:52

投稿

yumetodo
yumetodo

スコア5852

answer CHANGED
@@ -6,4 +6,44 @@
6
6
 
7
7
  デフォルト引数を使わない場合、呼び出すときにtemplate実引数をすべて指定しなければならず、非常に面倒です。
8
8
 
9
- なのでデフォルト引数を利用しているに過ぎません。
9
+ なのでデフォルト引数を利用しているに過ぎません。
10
+
11
+ ---
12
+
13
+ 話がそれますが、`disable_if`は標準にないのでわざわざ定義する必要があり、めんdなので普通は条件式をひっくり返すか、C++17で追加された`std::negation`を使うように思います。
14
+
15
+ また`std::enable_if`の使い方ですが、
16
+ [std::enable_ifを使ってオーバーロードする時、enablerを使う?](https://qiita.com/kazatsuyu/items/203584ef4cb8b9e52462)
17
+ に紹介のあるように
18
+
19
+ ```cpp
20
+ template <class T, std::enable_if_t<std::is_class_v<T>, std::nullptr_t> = nullptr>
21
+ void check(T value)
22
+ {
23
+ std::cout << "1" << std::endl;
24
+ }
25
+ template <class T, std::enable_if_t<!std::is_class_v<T>, std::nullptr_t> = nullptr>
26
+ void check(T value)
27
+ {
28
+ std::cout << "2" << std::endl;
29
+ }
30
+ ```
31
+
32
+ のように使うことが多いです。
33
+
34
+ もっともC++17で追加された[if constexpr文](https://cpprefjp.github.io/lang/cpp17/if_constexpr.html)を使って
35
+
36
+ ```cpp
37
+ template <class T>
38
+ void check(T value)
39
+ {
40
+ if constexpr(std::is_class_v<T>){
41
+ std::cout << "1" << std::endl;
42
+ }
43
+ else {
44
+ std::cout << "2" << std::endl;
45
+ }
46
+ }
47
+ ```
48
+
49
+ とするほうがシンプルですね。