Câu trả lời này được dựa trên this fun-fact: Trong hàm trả về void
, bạn có thể trả về bất kỳ biểu thức nào trong đó loại bị vô hiệu.
Vì vậy, giải pháp đơn giản là:
virtual T Execute() const
{
if (comm) // boolean logic change, typo in OP?
return comm();
else
return static_cast<T>(NULL);
}
Khi T = void
, báo cáo kết quả lợi nhuận cuối cùng là tương đương với return;
.
Tuy nhiên, tôi cảm thấy đây là thiết kế kém. Là NULL
có ý nghĩa cho mỗiT
? Tôi không nghĩ vậy. Tôi sẽ ném một ngoại lệ:
virtual T Execute() const
{
if (comm)
return comm();
else
throw std::runtime_error("No function!")
}
Tuy nhiên, điều này được thực hiện automatically by Boost, do đó, mã của bạn sẽ trở thành nhiều bụi:
virtual T Execute() const
{
return comm();
}
Sau đó, bạn có thể thêm chức năng bổ sung, chẳng hạn như:
bool empty(void) const
{
return !comm; // or return comm.empty() if you're the explicit type
}
Vì vậy, người dùng có thể kiểm tra xem nó có thể được gọi trước khi gọi nó. Tất nhiên tại thời điểm này, trừ khi lớp học của bạn có chức năng bổ sung mà bạn đã bỏ ra vì lợi ích của câu hỏi, tôi thấy không có lý do gì để không chỉ sử dụng boost::function
ngay từ đầu.
Giả sử đó là 'if (comm)'? – GManNickG
Thật vậy. Sửa lỗi ngay bây giờ. –