问题
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
回答1:
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)
回答2:
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.
来源:https://stackoverflow.com/questions/8449036/is-it-possible-to-deduce-whether-type-is-incomplete-without-compilation-failure