¿Hay alguna forma en que pueda construir un nuevo objeto a partir del objeto dado si los parámetros de plantilla de ambos objetos son idénticos en tiempo de ejecución? Por ejemplo:Clases de plantillas C++ y construcción de copias
tengo una clase de plantilla con la declaración:
template<typename _Type1, typename _Type2> class Object;
A continuación, tengo dos instancias de la plantilla:
template class Object<char, int>;
template class Object<wchar_t, wint_t>;
Ahora, quiero escribir una función miembro, tales como:
template<typename _Type1, typename _Type2>
Object<char, int> Object<_Type1, _Type2>::toCharObject() {
if(__gnu_cxx::__are_same<_Type1, char>::__value)
return *this;
else {
//Perform some kind of conversion and return an Object<char, int>
}
}
he intentado un par de técnicas, como el uso __gnu_cxx::__enable_if<__gnu_cxx::__are_same<_Type1, char>::__value, _Type1>::__type
en un constructor de copia para la clase Oject
, pero yo sigo corriendo en el error:
error: conversion from ‘Object<wchar_t, wint_t>’ to non-scalar type ‘Object<char, int>’ requested
¿No hay manera de que pueda hacer esto? ¡Cualquier ayuda será apreciada!
Los nombres de su tipo de plantilla no son válidos. Los subrayados seguidos de los identificadores de letras mayúsculas ** están reservados para su uso por parte de la implementación **. Podrían chocar con los nombres definidos por el compilador o la biblioteca estándar. – jalf
@jaif: No te preocupes demasiado por los nombres tipográficos. Simplemente los elegí arbitrariamente para el ejemplo. Todo mi código está realmente definido en un espacio de nombres diferente, por lo que no debería haber conflictos. – themoondothshine
Los espacios de nombres no son los nombres de los problemas, como _Tipo1 están reservados bajo TODAS las circunstancias (pueden ser macros, por ejemplo), y en este caso es poco probable que la implementación los utilice. ¿O estás diciendo que lo que publicaste no es el código real que está causando tu problema? Bueno, no hagas eso tampoco. –