07/09/30 14:16:00
>>90
#include <stdio.h>
#include <boost/type_traits.hpp>
class test1 {
public: static void foo() {printf("test1\n"); }
};
template<typename t, typename result, typename arg>
class test2 {
public: static void foo() {printf("test2\n"); }
};
template<typename t, typename arg>
class test3 {
public: static void foo() {printf("test3\n"); }
};
namespace detail {
template<typename t, typename sig> struct selector {
typedef test1 type;
};
template<typename t, typename result, typename arg> struct selector<t, result (t::*)(arg)> {
typedef typename boost::mpl::if_<boost::is_void<result>, test3<t,arg>, test2<t,result,arg> >::type type;
};
}
int main(int argc, char *argv[]) {
detail::selector<test1,void>::type::foo();
detail::selector<test1,int(test1::*)(int)>::type::foo();
detail::selector<test1,void(test1::*)(int)>::type::foo();
return 0;
}