AMDG Noah Roberts wrote:
This seems to me like it should work. Yet the check() call resolves, without error, to the first one...which should cause an error and trigger SFINAE. Can anyone help me figure out what gives?
Compiler is MSVC++ 8. Normally the SFINAE stuff works so I'm betting on my mistake this time.
Basically I need to check it the metafunction meta<T> returns something. If it does then the object is a record. If it doesn't then it is not.
What do you mean by "returns something"? meta<T>::type always exists, so SFINAE doesn't apply.
template < typename RECORD > struct meta { struct type; };
<snip>
struct test { typedef boost::mpl::vector< int, double > fields; };
Would this work:
BOOST_MPL_HAS_XXX_TRAITS_DEF(fields);
template<typename RECORD>
struct field_is_sequence : boost::mpl::is_sequence<typename
RECORD::fields> {};
template<typename RECORD>
struct meta : boost::mpl::and_
int main() { // output is 1\n1\n. std::cout << is_record_check<test>::value << std::endl; std::cout << is_record_check<int>::value << std::endl;
meta<int>::type exists, and since only a pointer to it is used it isn't instantiated.
// meta<int>::type x; - yet this will cause compilation error.
Now meta<int>::type is instantiated, so we get a compilation error. In Christ, Steven Watanabe