En este post considero el problema de comprobar si un tipo coincide exactamente con otro, no es exactamente lo que se solicita, pero es más simple y espero que pueda ayudar a comprender los trucos de plantilla aplicados.
Como se hizo en boost, se pueden adoptar especializaciones de plantilla para esa tarea, de hecho, puede definir una estructura de plantilla que contenga operaciones en un tipo dado, y utilizar estructuras de plantilla anidadas para esas operaciones.En nuestro caso:
// 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; };
};
Definición de una macro permite utilizarlo fácilmente:
#define is_type_same(T1,T2) (is_type<T1>::same_of<T2>::value)
de la siguiente manera:
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;
}
yo sepa C++ no admite en tiempo de ejecución limitaciones de los parámetros de plantilla como aquellos que estás pidiendo ¿Quizás RTTI ('typeid') o' dynamic_cast' podría usarse para ese fin en tiempo de ejecución? – stakx
@stakx: ¿Qué tiene esto que ver con el tiempo de ejecución? R1 y R2 son conocidos en tiempo de compilación. – GManNickG
Puede usar información en tiempo de compilación para verificar que, consulte la biblioteca de verificación del concepto de impulso (enlace en mi respuesta). No hay necesidad de RTTI cuando se trata de tipos utilizados en la compilación como en este ejemplo. – Klaim