Giả sử chúng ta có một lớp học mà có thể viết công cụ để sản lượngGiao diện thiết kế: an toàn của chức năng quá tải tham gia chuỗi và char mảng
class Writer
{
public:
int write(const std::string& str);
int write(const char* str, int len);
//...
};
tôi vẫn ổn với điều này, linh hoạt của nó và tất cả những gì, cho đến khi tôi nhận ra
char* buf = new char[n]; //not terminated with '\0'
//load up buf
Writer w;
w.write(buf); //compiles!
Đó là một lỗi thực sự thực sự là.
Chúng ta có thể sửa đổi một chút với một số khuôn mẫu
class WriterV2
{
public:
int write(const std::string& str);
int write(const char* str, int len);
template<typename... Args>
int write(const char*, Args...)
{ static_assert(sizeof...(Args) < 0, "Incorrect arguments"); }
//...
};
Nhưng phương pháp này có vấn đề của nó
WriterV2 w;
w.write("The templating genius!"); //compile error
Tôi phải làm gì? Một thiết kế tốt hơn là gì?
Và trước khi có ai đó hỏi, quá tải cho const char (&)[N]
does not work. Nó có thể là khả thi để tạo ra một wrapper để làm điều này, nhưng có vẻ như ... overkill?
EDIT Thêm phương thức write(char*)
và phát ra lỗi không lý tưởng. Khi vượt qua buf
xung quanh thông qua các chức năng và tất cả các chức năng, nó có thể trở thành const char*
.
Tại sao bạn không khai báo phương thức để xử lý trường hợp này nhưng không triển khai? int write (char * str); – ifma
Được rồi, nhưng tại sao phải có sự phân biệt giữa hai loại? Ngoài ra, gọi 'w.write (buf);' sẽ _always_ gọi 'int Writer :: write (const std :: string & str);' Nếu bạn muốn nó gọi 'int Writer :: write (const char * str, int len) ; ', sau đó thêm tham số chiều dài vào cuộc gọi của bạn – InternetAussie
Sử dụng std :: vector làm đệm. –