2010-05-09 36 views
5

GCC đến 4.5 không có mẫu tiêu chuẩn kiểu C++ 0x loại has_nothrow_move_constructor. Tôi có thể sử dụng nó trong gói của tôi để tối ưu hóa, nhưng tôi không muốn loại trừ một trong các trình biên dịch phổ biến và không muốn quá tải cấu hình với các biểu tượng như HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR. Có phải bằng cách nào đó có thể sử dụng mẫu đó nếu có và chỉ cần quay lại sao chép nếu không có mặt mà không cần sử dụng bất kỳ biểu tượng cấu hình được xác định trước nào? Tôi cũng không muốn phụ thuộc vào Boost, vì thư viện của tôi nhỏ và không cần Boost vì bất kỳ lý do nào khác.Phát hiện mẫu hiện diện tại thời điểm biên dịch

Trong giả, tôi cần một cái gì đó như:

template <typename type> 
struct has_nothrow_move_constructor_robust 
    : public integral_constant <bool, 
      /* if possible */ has_nothrow_move_constructor <type>::value 
      /* otherwise */ false> 
{ }; 

Kể từ khi nhà xây dựng di chuyển chỉ dành cho C++ 0x dù sao, tôi không quan tâm sử dụng khác C++ 0x tính năng cho định nghĩa trên, nếu tại tất cả có thể.

+3

Hầu hết Boost được triển khai trong tệp tiêu đề, không phải tệp đối tượng. Vì vậy, nếu bạn gắn bó với những người đó, bạn không phải trả tiền phạt cho những thứ mà bạn không sử dụng - cũng như đối với hầu hết những thứ mà bạn sử dụng, cho vấn đề đó. –

+0

Đó là nhiều hơn có một sự phụ thuộc (ngay cả khi hầu như tất cả mọi người sử dụng Boost anyway). Có lẽ tôi có thể xé bỏ phần có liên quan của Boost, nhưng vì thư viện của tôi cũng giống như 3 tiêu đề ... – doublep

+0

Có vẻ khó để kiểm tra xem một loại có tồn tại hay không. Nhưng sau đó, nếu không có nhà xây dựng di chuyển, sẽ không C + + 0x thường tự động quay trở lại sao chép? Hoặc nếu phần nothrow quan trọng, không phải là một chút khó khăn để tưởng tượng một lớp học mà sao chép là bất kỳ an toàn hơn di chuyển (nếu sau này không được đánh dấu nothrow)? – UncleBens

Trả lời

1

boost::variant có thực hiện has_nothrow_move để sử dụng nội bộ của riêng mình - bạn có thể sử dụng điều đó, mặc dù nó không đáng tin cậy như việc triển khai trình biên dịch phù hợp. Nguồn cho nó là here - Tôi không biết nó đáng tin cậy như thế nào, vì vậy YMMV.

Ngoài ra, bạn có thể thử nghiệm các macro phiên bản trình biên dịch (__GNUC__ and __GNUC_MINOR__) để xác định sự hiện diện và phân phát nếu không có mặt. Thật không may có vẻ như has_nothrow_move_constructor không được hỗ trợ trong bất kỳ phiên bản phát hành của G + + nào được nêu ra, vì vậy bạn sẽ phải chờ một chút trước khi bạn sẽ biết phiên bản quyền sử dụng.

Các vấn đề liên quan