Có thể không sử dụng trong ví dụ của bạn, nhưng có một số trường hợp khó xử lý void
trong mã mẫu và tôi hy vọng quy tắc này sẽ giúp với điều đó đôi khi. ví dụ rất giả tạo:
#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>();
}
Lưu ý rằng chỉ main
có để đối phó với thực tế là trong trường hợp void
không có gì để trở về từ retval
là. Hàm trung gian do_something_and_return
là chung.
Tất nhiên, điều này chỉ giúp bạn cho đến thời điểm này, nếu bạn muốn lưu trữ retval
trong biến và làm điều gì đó với nó trước khi trở về, thì bạn vẫn gặp rắc rối - bạn phải chuyên (hoặc quá tải) do_something_and_return
cho khoảng trống.
Nguồn
2010-08-08 15:29:26
Cảm ơn. Tất cả các câu trả lời đều tốt, nhưng điều này minh họa cho điểm độc đáo. – kirk0