
Hi, Yesterday I had a need to detect, is class forward declared or is it complete. Here are some thoughts: template <class T, int Misc> struct is_complete { typedef char false_type; typedef int true_type; template <class T1> static typename boost::enable_if_c<sizeof(T1), true_type>::type test(int); template <class T1> static false_type test(...); enum ENU { value = ( sizeof(test<T>(0)) == sizeof(true_type) )}; }; 'Misc' parameter is required to work around compilers one time instantiation: struct incomplete; template <int N> struct incomplete_template; struct complete{}; struct complete_abstract{ virtual void foo() =0; }; void test(); void foo1() { cout << is_complete<incomplete, __LINE__>::value << is_complete<incomplete_template<0> , __LINE__>::value << is_complete<incomplete_template<1> , __LINE__>::value << is_complete<complete, __LINE__>::value << is_complete<complete_abstract, __LINE__>::value << endl; } struct incomplete{}; template <> struct incomplete_template<0>{}; void foo2() { cout << is_complete<incomplete, __LINE__>::value // Without second template parameter it would be still returning 0 << is_complete<incomplete_template<0> , __LINE__>::value << is_complete<incomplete_template<1> , __LINE__>::value << is_complete<complete, __LINE__>::value << is_complete<complete_abstract, __LINE__>::value << endl; } int main() { foo1(); // Outputs 00011 foo2(); // Outputs 11011 return 0; } I was thinking of changing 'Misc' parameter definition to something like this: template <class T, class... Misc> struct is_complete ; Than it can be used in template functions/classes just like this: template <class T, class... SomeClasses> void test_function() { is_complete<T, SomeClasses..., boost::mpl::int_<__LINE__> >::value; } So, Is there interest in such metafunction? Can somebody give advices how to improve it? (I`m not sure that implementation is portable, I`ve tested it only on GCC-4.6 and CLANG-3.0, MSVC compiler will be available only tomorrow) -- Best regards, Antony Polukhin