En C++ todos los argumentos de tipo deben tener un nombre, ya sea que lo use o no, por lo que no hay signo de interrogación. Simplemente haga que sea un argumento de plantilla para la función y asígnele un nombre y debería estar bien.
template <typename T>
struct templ {
template <typename U>
void assign(templ<U> & u); // public void assign<?>(temple<U> u)
};
Esa es la parte trivial, la parte más compleja es hacer cumplir las restricciones sobre el tipo, y para eso se puede utilizar SFINAE:
template <typename T>
struct templ {
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<U,T>::value
>::type >
void super(templ<U> & u); // public void super_<? super T>(templ<?> u)
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<T,U>::value
>::type >
void extends(templ<U> & u); // public void extends_<? extends T>(templ<?> u)
}
que está utilizando C++ 11 para el SFINAE, en C++ 03, es un poco más intrincado (como si esta versión fuera simple) ya que no puede usar SFINAE en un argumento de plantilla de función, por lo que SFINAE debe aplicarse al tipo de retorno o a los argumentos de funciones adicionales. SFINAE es una solución mucho más poderosa, puede utilizarse no solo para proporcionar super
y extends
, sino también con muchas otras características de tipos o valores de tiempo de compilación. Google for SFINAE y encontrará muchos casos de uso de SFINAE, muchos de ellos serán de estilo C++ 03.
Hubo una propuesta de conceptos que habrían simplificado enormemente la sintaxis, pero no se llegó a un acuerdo y en un movimiento para llevar el estándar a su finalización se pospuso para un estándar posterior.
Ahora bien, esto no es tan común en C++ como lo es en Java, así que le recomiendo que haga una pregunta diferente sobre lo que quiere hacer, y obtendrá ideas para diseños en C++ más idiomáticos.
Y las plantillas de C++ ni siquiera son ligeramente como Java Generics. Las plantillas C++ crean nuevos tipos; Java Generics restringe los tipos existentes. Las plantillas de C++ son básicamente un preproceso con algunas reglas de tipo injertado; Java Generics se basa en la teoría de tipos. No se deje seducir por la notación para pensar que son casi equivalentes. Ellos no son – EJP
Joshua Bloch afirma en varios videos que los comodines no deben usarse para los tipos de devolución. ¿Estás seguro de que son una buena idea en tu caso? ¿Puedes publicar la función o al menos su firma? – fredoverflow
por favor, ¿podría agregar la función? –