
Jonathan Turkanis wrote:
Hi All,
I'm writing a macro-based interface definition language, which I hope to post soon. For this, I need to be able to detect the presence of member functions with given name and signature. My current formulation generates code like the following to test whether a class has a non-const member function named 'one' with the signature char(int, float):
Attached code works in MSVC71. Maybe this will give you some idea.
cl /GX /GR T543.cpp
/out:T543.exe T543.obj
T543 1 0 0 0 0 1
B. #include <iostream> template <typename Type> class has_member__one { // 1. SIGNATURE goes here template <char (Type::*)(int, float)> struct helper{}; typedef char (&yes) [1]; typedef char (&no) [2]; template <typename Type_> // 2. NAME goes here static yes test (helper<&Type_::one>*); template <typename Type_> static no test (...); public: enum {value = sizeof(test<Type>(0)) == sizeof(yes)}; }; struct A // 1 { char one(int, float); }; struct B // 0 { int one; }; class C // 0 { }; struct D // 0 { float one(); void one(int, float); void one(int, int); }; struct E // 0 { int one(int); int one(int, int); char one(int, float) const; }; struct F // 1 { void one(int); char one(int, int); char one(int, float); char one(int, float) const; }; int main() { std::cout << has_member__one<A>::value << std::endl; std::cout << has_member__one<B>::value << std::endl; std::cout << has_member__one<C>::value << std::endl; std::cout << has_member__one<D>::value << std::endl; std::cout << has_member__one<E>::value << std::endl; std::cout << has_member__one<F>::value << std::endl; }