Вероятно, бесполезен в вашем примере, но в некоторых ситуациях трудно иметь дело с void
в коде шаблона, и я ожидаю, что это правило иногда помогает в этом.Очень надуманный пример:
#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>();
}
Обратите внимание, что только main
должен справиться с тем фактом, что в случае void
нечего возвращать из retval
.Промежуточная функция do_something_and_return
является универсальной.
Конечно, это только покажется вам - если бы do_something_and_return
хотел, в обычном случае, сохранить retval
в переменной и что-то с ней сделать перед возвратом, тогда у вас все еще будут проблемы - вам придется специализироваться (или перегружаться) do_something_and_return
для void.