64,637
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/type_traits.hpp>
/* type trait : has_arrow_operator<T> */
template <typename T>
struct has_arrow_operator {
template <int> struct test;
template<typename U>
static boost::type_traits::yes_type check_sig(test<sizeof(&U::operator ->)>* = NULL);
template<typename U>
static boost::type_traits::no_type check_sig(...);
static const bool value = sizeof(check_sig<T>(0)) == sizeof(boost::type_traits::yes_type);
};
/* operator -> available */
class A {
public:
A* operator -> ();
};
/* operator -> hidden */
class B {
protected:
B* operator -> ();
};
/* operator -> not available */
class C {
};
int main() {
std::cout << has_arrow_operator<int>::value << std::endl;
std::cout << has_arrow_operator<boost::shared_ptr<int> >::value << std::endl;
std::cout << has_arrow_operator<A>::value << std::endl;
// ????? how to make this false
//std::cout << has_arrow_operator<B>::value << std::endl;
std::cout << has_arrow_operator<C>::value << std::endl;
}
template <B>
// class B的定义放前面
struct has_arrow_operator {
template <int> struct test;
template<B>
static boost::type_traits::yes_type check_sig(test<sizeof(&U::operator ->)>* = NULL);
template<B>
static boost::type_traits::no_type check_sig(...);
static const bool value = sizeof(check_sig<B>(0)) == sizeof(boost::type_traits::no_type);
};