В этом посте я рассматриваю проблему проверки, точно ли тип соответствует другому, это не совсем то, о чем просят, но это проще, и я надеюсь, что это поможет понять применяемые приемы шаблона.
Как и в Boost, для этой задачи могут быть приняты специализации шаблонов, фактически вы можете определить структуру шаблона, содержащую операции для данного типа, и использовать для этих операций вложенные структуры шаблона. В нашем случае:
// Working on a specific type:
template <typename T1>
struct is_type {
// For all types T2!=T1 produce false:
template <typename T2>
struct same_of { static const bool value = false; };
// Specialization for type T2==T1 producing true:
template <>
struct same_of<T1> { static const bool value = true; };
};
Определение макроса позволяет легко использовать его:
#define is_type_same(T1,T2) (is_type<T1>::same_of<T2>::value)
следующим образом:
template<class R1, class R2>
bool operator==(Manager<R1> m1, Manager<R2> m2) {
return is_type_same(R1,R2) && m1.internal_field == m2.internal_field;
}