2012-01-05 28 views
5

C++ 11 có hai loại dữ liệu tích phân ký tự mới, char16_tchar32_t. Tôi muốn mô phỏng chúng cho trình biên dịch mà không có một loại riêng biệt để quá tải hoạt động I/O để xem chúng một ký tự thay vì giá trị số nguyên của chúng.mô phỏng đầy đủ các kiểu nội trang riêng biệt bị thiếu (cụ thể: char16_t và char32_t)

Đây là những yêu cầu:

  • biệt (không typedef).
  • chính xác chiều rộng trên các hệ thống bình thường (ala uint16_t và uint32_t)
  • C++ 11 tính năng khác được phép (xem dưới đây nỗ lực đầu tiên)
  • Phải chơi đẹp với literals; char16_t c16 = u"blabla unicode text blabla"; phải hoạt động.
  • nếu char16_t có thể được sử dụng trong toán tử toán học, rõ ràng điều này cũng cần phải hoạt động.

nỗ lực đầu tiên của tôi mà không ở bộ phận văn chương là một enum mạnh mẽ gõ:

enum char16_t : uint16_t; 

này có nhược điểm khác là tốt, mà có lẽ có thể được giải quyết bằng cách cung cấp các nhà khai thác cần thiết bản thân mình (mà thực sự là tốt bởi tôi).

+0

Hoàn toàn không rõ lý do tại sao bạn đang thử công cụ này hoặc bạn muốn sử dụng công cụ nào. "Lần thử đầu tiên" sử dụng C++ 11. Không có cách nào để có được Unicode literals từ một trình biên dịch không có hỗ trợ Unicode được bảo đảm, và không có cách nào để thao tác các chuỗi tại thời gian biên dịch mà không có trình biên dịch C++ 11 gần đây. – Potatoswatter

Trả lời

1

Tôi không nghĩ rằng bạn sẽ nhận được khởi tạo để làm việc vì không có nhiều phạm vi để làm cho nó hoạt động. Vấn đề là việc khởi tạo bạn đang sử dụng trong ví dụ của bạn là không được phép làm việc: chuỗi chữ u"..." mang lại một một mảng của char16_t const đối tượng và bạn muốn khởi tạo một con trỏ với nó:

char16_t const* c16 = u"..."; 

Ngoài ra, không thực hiện char16_t trong trình biên dịch, rất khó có thể hỗ trợ char16_t chuỗi ký tự. Điều tốt nhất bạn có thể đạt được là chơi các thủ thuật macro nhằm làm điều đúng đắn. Bây giờ, bạn sẽ sử dụng ví dụ: ký tự đại diện rộng và khi bạn nhận được một trình biên dịch hỗ trợ char16_t bạn chỉ cần thay đổi macro để sử dụng char16_t literals. Ngay cả khi việc này hoạt động, bạn có thể cần sử dụng loại bản ghi lớn hơn 16 bit vì wchar_t sử dụng 32 bit trên một số nền tảng.

#define CONCAT(a,b) a##b 

#if defined(HAS_C16) 
# define C16S(s) CONCAT(u,s) 
#else 
# define C16S(s) reinterpret_cast<char16_t const*>(CONCAT(L,s)); 
struct char16_t 
{ 
    unsigned short value; 
}; 
#endif 


int main() 
{ 
    char16_t const* c16 = C16S("..."); 
} 

Rõ ràng, bạn vẫn cần phải cung cấp tất cả các loại toán tử, ví dụ: để làm cho số học số nguyên và chuyển đổi phù hợp hoạt động.

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