型が完全型かを調べるメタ関数

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, "");
}