Trong C nó khá phổ biến để sử dụng void *
tạo một bộ sưu tập chung chung. Ví dụ, nếu bạn muốn có một danh sách liên kết chung chung, bạn có thể viết một cái gì đó như:
typedef struct node {
void *data;
struct node *next;
} node;
Sau đó, bạn có thể tạo ra một danh sách liên kết của foo
, một danh sách liên kết của bar
, và vân vân.
Trong C++, tuy nhiên, điều này hiếm khi hữu ích. Trong trường hợp điển hình, bạn muốn viết mã tương đương làm mẫu thay thế:
template <typename T>
class node {
T data;
node *next;
};
Với trình biên dịch cũ hơn, bạn có thể giảm mã được tạo bằng cách kết hợp hai kỹ thuật. Trong trường hợp này, bạn sẽ sử dụng tập hợp con trỏ để hủy kích hoạt lưu trữ dữ liệu, sau đó có giao diện mẫu chỉ xử lý việc đúc T *
đến void *
khi bạn lưu trữ dữ liệu và quay lại từ void *
đến T *
khi bạn truy lục dữ liệu.
Cải tiến trong trình biên dịch/trình liên kết đã khiến kỹ thuật này (gần như?) Hoàn toàn lỗi thời. Các trình biên dịch cũ hơn sẽ tạo ra mã riêng biệt cho từng loại mà bạn đã khởi tạo mẫu của mình, ngay cả khi loại instantiation không liên quan. Các trình biên dịch hiện tại (hoặc các thanh công cụ, dù sao - một chút về điều này thực sự được xử lý bởi trình liên kết) xác định các trình tự mã giống hệt nhau và hợp nhất chúng lại với nhau một cách tự động.
Dòng dưới cùng: trừ khi bạn cần khả năng tương thích C hoặc bạn đang viết thay thế operator new
/operator delete
, sử dụng void *
bằng văn bản C++ thường khá hiếm.
Nguồn
2013-06-26 21:41:26
C++ thường có các lựa chọn thay thế tốt hơn, và tôi biết có một bản dupe cụ thể mà tôi đang nghĩ tới. – chris
Trong C++ không bao giờ sử dụng 'void *' mong đợi trong * rất * hoàn cảnh đặc biệt. –
Đó là một trong những tính năng * đó *. Nếu bạn không biết nếu bạn cần nó, bạn không cần nó. – delnan