std::is_class
is_class<T>を使うとTがクラス(構造体含む)かどうか判定してくれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <iostream> template<typename T> void func(T t) { // Tはclassでは駄目。(以下structも駄目) static_assert(!std::is_class<T>::value, "T must not a class"); // Tはclassへのポインターじゃ駄目 static_assert(!std::is_class< std::remove_pointer<T>::type >::value, "T must not a ptr to class"); // Tはclassへのポインターのポインターじゃ駄目 static_assert(!std::is_class< std::remove_pointer< std::remove_pointer<T>::type >::type >::value, "T must not a ptr to ptr to class"); } class C {}; struct S {}; enum E {}; enum class EC {}; int main() { int i; func(1); func(&i); func(false); C c; // func(c); // error // func(&c); // error C** ppc; // func(ppc); // error func(&ppc); S s; // func(s); // error // func(&s); // error E e; func(e); func(&e); EC ec; func(ec); func(&ec); } |
テンプレート関数funcはクラスや、クラスへのポインターや、クラスへのポインターのポインターを渡すとエラーになる。 ただしクラスへのポインターのポインターのポインターを渡すことはできる。
ソース
https://github.com/ambiesoft/blogprogs/tree/master/6022/isClass