Chris Fairles"
on Fri, 20 Jul 2007 18:03:18 -0400 How can you determine (compile-time) that a class has a serialize function? struct foo { template <typename Archive> void serialize (Archive &, const unsigned int); };
"&foo::serialize" isn't a type and I can't figure out a way to make it a type (besides a typedef in the class) and also a constant expression.
Tried to play around with this as well but theres no substitution failure here and static functions can't be constant expressions (commonnnn c++0x!!)
struct serialize { template <typename T> static void value(T const&) { void(T::*f)(archive::xml_oarchive &, const unsigned int) = &T::template serializearchive::xml_oarchive; (void)f; } };
Basically, in the code below I want to see "GoodGood" printed out and the only thing I can change is Q.
struct A{ void f(int,int){} }; struct B{};
template
struct Q{enum{value=false};}; template<class T> struct Q
{enum{value=true};}; int main(){ if(Q<A>::value) { cout << "Good";} if(!Q<B>::value){ cout << "Good";} }
Help/hints/remotely possible?
You can try something like this. #include <iostream> #include <iomanip> typedef char yes_type; struct no_type { char padding[8]; }; template <class T> struct HasSerializeMember { typedef void (T::*SerializationFun)(int &, unsigned); template <SerializationFun> struct A {}; template <class Q> static yes_type Test(A<&Q::serialize>*); template <class Q> static no_type Test(...); static const bool value = sizeof(Test<T>(0)) == sizeof(yes_type); }; struct A { template <class Stream> void serialize(Stream & strm, unsigned version) {} }; struct B { }; struct C { void serialize() {} }; int main() { using namespace std; cout << boolalpha << HasSerializeMember<A>::value << '\n' // true << HasSerializeMember<B>::value << '\n' // false << HasSerializeMember<C>::value << endl; // false } Regards, Roman Perepelitsa Deutsche Bank Moscow +7 (495) 660-74-08 --- This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and delete this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. Please refer to http://www.db.com/en/content/eu_disclosures.htm for additional EU corporate and regulatory disclosures.