#include <iostream>
#include <tr1/memory>
#include <typeinfo>
#include <vector>
using namespace std;
template<typename T>
struct smart_ptr_checker {
enum {value = false};
typedef long type;
};
template<template<typename> class P, typename T>
struct smart_ptr_checker< P<T> > {
enum {value = true};
template<typename C> static bool test( typeof(&C::operator->) );
template<typename C> static long test(...);
typedef typeof(test<P<T> >(0)) type;
};
int main()
{
cout << typeid(smart_ptr_checker<int>::type).name() << endl; // long
cout << typeid(smart_ptr_checker<tr1::shared_ptr<int> >::type).name() << endl; // bool
cout << typeid(smart_ptr_checker<vector<int> >::type).name() << endl; // long
return 0;
}
如果是A为智能指针类,则smart_ptr_checker<A >::type == bool
否则smart_ptr_checker<A >::type == long