2012-02-22 48 views
6

trạng:làm typedefs không tương thích

typedef int TypeA; 
typedef int TypeB; 

tôi cần phải thực hiện TypeA không tương thích với TypeB (vì vậy bất kỳ nỗ lực để gán TypeA để TypeB sẽ châm ngòi cho biên dịch lỗi), trong khi giữ lại tất cả các chức năng được cung cấp bởi nhà khai thác built-in loại ().

Một cách để thực hiện điều đó là bọc từng loại vào cấu trúc/lớp riêng biệt (và xác định lại tất cả các toán tử, v.v.).

Có cách nào khác, "thanh lịch" hơn, cách để làm điều đó không?

Thư viện của bên thứ ba không được phép. C++ 0x/C++ 11x không được hỗ trợ. (C++ 2003 được hỗ trợ)

+0

có thể trùng lặp của [Phân biệt giữa typedefs với cùng loại trong C++] (http://stackoverflow.com/questions/3129078/discriminating-between-typedefs-to-same-type-in-c) –

Trả lời

4

Cách duy nhất là tạo một loại mới (bằng cách sử dụng ví dụ BOOST_STRONG_TYPEDEF).

+0

Ok, bây giờ, Boost là Magic; nhưng làm thế nào mà đi qua quyền truy cập vào các thành viên và phương thức của loại bọc? – Chowlett

+1

@Chowlett Nhìn vào việc triển khai BOOST_STRONG_TYPEDEF, tôi thấy rằng [họ đã triển khai lại tất cả các nhà khai thác] (http://www.boost.org/doc/libs/1_39_0/boost/operators.hpp). –

+0

Tôi có thể thấy rằng kế thừa từ 'global_ordered2 <...>' cung cấp quyền truy cập cho tất cả các toán tử _comparison_, thông qua 'less_than_comparable' và' equality_comparable'. Nhưng tôi không thể thấy làm thế nào, nếu tôi 'BOOST_STRING_TYPEDEF (std :: string, Foo);', tôi có thể làm 'Foo foo =" foo "; foo.length(); ' – Chowlett

0

Để kích hoạt lỗi trình biên dịch, bạn có thể tạo cả hai loại làm lớp. Trong TypeA, hãy tạo toán tử chuyển đổi và/hoặc hàm tạo chuyển đổi thành/từ TypeB - và thực hiện các phương thức này riêng.

Bằng cách này, mọi chuyển đổi từ TypeB đến TypeA sẽ gọi cho hàm chuyển đổi và trình biên dịch sẽ phát hiện lỗi rằng phương thức đó là riêng tư! Đảm bảo rằng bạn có thể cần phải viết vài toán tử chuyển đổi/nhà xây dựng từ/để bạn muốn chuyển đổi xảy ra thành công. Ý tôi là, nếu bạn muốn chuyển đổi từ float, bạn cần phải viết hàm tạo dùng float và cứ thế cho các loại khác.

Bạn có thể viết toán tử chuyển đổi, nhà thầu trong số TypeA hoặc TypeB và danh sách chuyển đổi được phép trong các lớp này.

+0

Tôi có thể sử dụng loại kết quả với tất cả các toán tử sau đó, mà không chuyển tiếp chúng theo cách thủ công không? – Sibbo