Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to deduce whether type is incomplete without compilation failure? [duplicate]

I want to achieve behavior like sizeof(complete_type) will return real sizeof, and sizeof(incomplete_type) - will be just 0

I need this to provide extended run time type information for IPC(inter-process) communication with the description structure per type:

struct my_type_info
{
    bool   is_pointer;
    size_t size;         //for double* will be 4 on i386. that is sizeof(double*)
    size_t base_size;    //for double* will be 8. that is sizeof(double)
};

The problem appears when into my system goes something like class MyOnlyDeclaredClass; I got compilation error, obviously by reason I can't take size of it.

boost type_traits http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/index.html suggests many compile-time classes, but there is no 'is_incomplete'

Interesting compilers are VS2008, VS2010, clang 3, gcc-4.6, gcc-4.7

like image 349
dev_null Avatar asked Dec 09 '11 17:12

dev_null


2 Answers

Do not try to do that.

It is fundamentally unsound. Templates are parametrized by types, not instantiation point. A class type is not complete or not in itself, it is complete at some point during translation.

A template instantiated on some types must have the exact same semantic in every instantiation.

If not, the behaviour is not defined.

like image 123
curiousguy Avatar answered Sep 18 '22 12:09

curiousguy


Use SFINAE, as usual. This is one possible implementation:

struct char256 { char x[256]; };

template <typename T>
char256 is_complete_helper(int(*)[sizeof(T)]);

template <typename>
char is_complete_helper(...);

template <typename T>
struct is_complete
{
    enum { value = sizeof(is_complete_helper<T>(0)) != 1 };
};

Example:

#include <cstdio>

struct F;
struct G {};

int main()
{
    printf("%d %d\n", is_complete<F>::value, is_complete<G>::value);
    return 0;
}

(Note: Works on gcc 4.5 (no it's not because of C++0x) and clang 2.9, but not gcc 4.3)

like image 37
kennytm Avatar answered Sep 20 '22 12:09

kennytm