C++11標準ライブラリにもBoost 1.55.0にもなかったので、書きました。
たぶんこれで合ってると思いますが、sizeof(T)
が適用できるかどうかで、完全型かを判定しています。alignof(T)
とかでもいい。
たとえばメモリアロケータクラスとかだと、内部的に型のsizeof
を使ったりするので、型T
が完全型じゃないといけなかったりします。そういうクラステンプレートを設計する際に、このメタ関数をクラスの不変条件として使用できます。
#include <type_traits> #include <utility> struct is_complete_type_impl { template <class T> static auto check(T*) -> decltype( sizeof(T), std::true_type()); template <class T> static auto check(...) -> std::false_type; }; template <class T> struct is_complete_type : decltype(is_complete_type_impl::check<T>(nullptr)) {}; struct A; struct B {}; int main() { static_assert(is_complete_type<A>::value == false, ""); static_assert(is_complete_type<B>::value == true, ""); }