Probablemente no use en su ejemplo, pero hay algunas situaciones en las que es difícil tratar con void
en el código de la plantilla, y espero que esta regla ayude con eso a veces. ejemplo muy artificial:
#include <iostream>
template <typename T>
T retval() {
return T();
}
template <>
void retval() {
return;
}
template <>
int retval() {
return 23;
}
template <typename T>
T do_something() {
std::cout << "doing something\n";
}
template <typename T>
T do_something_and_return() {
do_something<T>();
return retval<T>();
}
int main() {
std::cout << do_something_and_return<int>() << "\n";
std::cout << do_something_and_return<void*>() << "\n";
do_something_and_return<void>();
}
en cuenta que sólo main
tiene que hacer frente al hecho de que en el caso void
no hay nada para volver de retval
. La función intermedia do_something_and_return
es genérica.
Por supuesto, esto solo lo lleva tan lejos - si do_something_and_return
quería, en el caso normal, almacenar retval
en una variable y hacer algo con eso antes de regresar, entonces aún estaría en problemas. Tendría que especializar (o sobrecargar) do_something_and_return
para el vacío.
Gracias. Todas las respuestas fueron buenas, pero esta ilustra el punto muy bien. – kirk0