Trait : type as first class value, great.
template <typename T>
struct AverageTrait
{
typedef T TAverage;
};
template<>
struct AverageTrait<int>
{
typedef float TAverage;
};
template <typename T>
typename AverageTrait<T>::TAverage
Average(T arg0, T arg1)
{
return (static_cast<typename AverageTrait<T>::TAverage>(arg0 + arg1))/2;
}
Average<int>(10,11)
-----------------------------------------------------------------
template <class T,
class Checker,
class ThreadModel>
struct SmartPtr: public Checker, ThreadModel{
T* operator->()
{
Check(p);
Lock(p);
return p;
}
explicit SmartPtr(T* aP)
{
p = aP;
}
~SmartPtr()
{
delete p;
}
T* p;
};
struct NullChecker
{
template< typename T>
void Check(T* p)
{
}
};
struct SingleThread
{
template< typename T>
void Lock(T* t)
{
}
};
SmartPtr<int, NullChecker ,SingleThread> sp(new int);
template <typename T>
struct AverageTrait
{
typedef T TAverage;
};
template<>
struct AverageTrait<int>
{
typedef float TAverage;
};
template <typename T>
typename AverageTrait<T>::TAverage
Average(T arg0, T arg1)
{
return (static_cast<typename AverageTrait<T>::TAverage>(arg0 + arg1))/2;
}
Average<int>(10,11)
-----------------------------------------------------------------
template <class T,
class Checker,
class ThreadModel>
struct SmartPtr: public Checker, ThreadModel{
T* operator->()
{
Check(p);
Lock(p);
return p;
}
explicit SmartPtr(T* aP)
{
p = aP;
}
~SmartPtr()
{
delete p;
}
T* p;
};
struct NullChecker
{
template< typename T>
void Check(T* p)
{
}
};
struct SingleThread
{
template< typename T>
void Lock(T* t)
{
}
};
SmartPtr<int, NullChecker ,SingleThread> sp(new int);