Probabilmente non utilizzare nel tuo esempio, ma ci sono alcune situazioni in cui è difficile gestire lo void
nel codice del modello e, a volte, mi aspetto che questa regola sia d'aiuto. esempio molto artificiosa:
#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>();
}
Nota che solo main
deve far fronte al fatto che nel caso void
non c'è niente di ritorno da retval
. La funzione intermedia do_something_and_return
è generica.
Ovviamente questo ti porta solo lontano - se il do_something_and_return
voleva, nel caso normale, memorizzare retval
in una variabile e fare qualcosa con esso prima di tornare, allora saresti ancora nei guai - dovresti specializzare (o sovraccaricare) do_something_and_return
per vuoto.
fonte
2010-08-08 15:29:26
Grazie. Tutte le risposte erano buone, ma questo ha ben illustrato il punto. – kirk0