2012-05-17 60 views
6

Tôi không thể tìm thấy bất cứ điều gì về điều này trên Internet, vì vậy tôi đang tìm một ai đó với những hiểu biết vào cách C++/CX là impemented. Wikipedia article trên C++/CX nói rằng nó hỗ trợ các bộ phát dựa trên thời gian chạy, có nghĩa là bạn không cần tệp tiêu đề có triển khai đầy đủ để khởi tạo một loại chung. Tôi cam kết cách thức hoạt động của .NET. Các assembly chứa mã IL và JIT có thể chèn các loại bê tông vào nó và biên dịch nó bất cứ khi nào có một phiên bản mới), nhưng trong C++/CX (được biên dịch nguyên bản) thì không có JIT để chỉnh sửa mã tại thời gian chạy (mà tôi giả định sẽ khá khó khăn đối với mã máy x86)Làm thế nào generics làm việc trong C++/CX

Vì vậy, điều gì là lừa ở đây, là loại tẩy xoá với boxing hoặc một số chương trình contrived mới?

(Tôi biết rằng các siêu dữ liệu về các loại được lưu trữ ở định dạng NET, tôi là sau khi mã trong các phương pháp)

+5

Mùi giống như phương pháp "chúng ta hãy bỏ mọi thứ vào đối tượng và sau đó quay lại" của Java để tiếp cận với generics. –

+0

một thời gian chạy dựa chung chung sẽ được. C + + loại chung xóa là tăng :: bất kỳ, nhưng bạn không nên làm generics thời gian chạy nếu bạn không phải, và hầu hết mọi người không bao giờ phải. Sử dụng mẫu để thay thế. –

+2

Tôi nghĩ rằng đó là một điều thời gian biên dịch. Khi bắt đầu một sự bắt đầu, như "MyTemplate obj;", trình biên dịch sẽ tạo ra một bản sao của định nghĩa lớp bê tông bằng cách sử dụng "MyTemplate" và "RealType", và sau đó sử dụng nó để tạo đối tượng. Không có mẫu nào sau khi biên dịch. – Lyn

Trả lời

3

Nhìn vào bài viết này ở đây các tài liệu tham khảo để generics vào hàng cuối cùng xác định rằng Generics được sử dụng trong C++/CX với giao diện và đại biểu.

http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx

này có ý nghĩa bởi vì kể từ khi nó được định nghĩa là một giao diện cho phép trình biên dịch ++/CX C để biên dịch các chức năng mã gốc cho các đối tượng thực tế, và sau đó sử dụng giao diện chung trong một thời trang tương tự như C mẫu ++. Mã gốc cho các hàm được biên dịch và giao diện chung được sử dụng để làm việc với các kiểu khác nhau.

Đối với trình biên dịch có vẻ như đây là sự khác biệt giữa C++/CLR và C++/CX. /clr: Các lớp Generics, giao diện & các đại biểu được phép. /ZW: Giao diện chung & chỉ dành cho đại biểu.

Nếu bạn nhìn vào đây http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx, bạn sẽ nhận thấy rằng không có quy tắc chung cho các lớp học.

Nhưng nếu bạn đọc chủ đề này http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx bạn sẽ nhận thấy rằng các generics được áp dụng như giao diện.

Một "lớp chung" trong C++/CX đạt được bằng cách sử dụng các mẫu C++ chuẩn. Sự khởi tạo hoặc trình biên dịch tạo ra loại đặc biệt của generic được xuất ra siêu dữ liệu, chứ không phải bản thân mẫu. Vì vậy, bạn có thể thấy một MyClass và MyClass từ siêu dữ liệu nhưng không phải là MyClass gốc. Điều này không đúng đối với trường hợp giao diện chung được xuất sang siêu dữ liệu dưới dạng loại chung.

biết thêm thông tin về vấn đề này có thể được tìm thấy ở đây http://en.wikipedia.org/wiki/Windows_Runtime

Vì vậy, để trả lời đầy đủ các câu hỏi, tính đến thời điểm này, các mã trong các phương pháp là mã gốc precompiled trong dll đầu ra hoặc exe và được gắn vào thực tế không các lớp chung. NHƯNG mã có thể được sử dụng chung bằng cách sử dụng các giao diện chung. Vì vậy, mười lớp khác nhau có thể thực hiện IMyInterface và sau đó một biến kiểu IMyInterface có thể được sử dụng để làm việc với các cá thể của mười loại khác nhau chẳng hạn.

Vì vậy, câu trả lời ngắn gọn là không có gì giống như các lớp chung chung trong C++/CX như có trong C++/CLR. Sử dụng các mẫu cho cùng một hiệu ứng trong các ứng dụng C++/CX. Nếu bạn phải có C++ generics thì hãy sử dụng dll được tạo bằng C++/CLI và làm việc mã đó từ một chương trình được biên dịch như C++/CX.

Lưu ý! Tôi lượm lặt điều này nhiều từ việc kiểm tra các bài báo khác nhau và một số trong số đó tại msdn dường như nói rằng chúng có thể bị thay đổi.

Bây giờ, việc sử dụng các giao diện chung trong C++/CX với các mẫu có lẽ là những gì chúng có ý định. Vì vậy, bạn tạo một mẫu có tên là MyClass và sau đó nó thực hiện giao diện chung của bạn được gọi là MyInterface, vì vậy nếu bạn sau đó tạo một mẫu MyClass instantiation, kiểu mới sẽ tự động triển khai MyInterface và giao diện này sau đó có thể được sử dụng ở bất kỳ đâu. Vì vậy, bên ngoài tệp dll và các tệp tiêu đề, các mô-đun và tệp C++/CX khác có thể làm việc với các kiểu như MyInterface mà không cần tệp tiêu đề, vì bản mẫu ngay bên trong dll đã biên dịch, nhưng tệp C++ sử dụng siêu dữ liệu biết cách tạo kiểu MyInterface vì nó có siêu dữ liệu cho MyInterface, nhưng không phải siêu dữ liệu cho MyClass.

Trong ngắn hạn không có lớp chung và giao diện chung và ủy quyền hỗ trợ trong C++/CX là tất cả những gì thực sự hoạt động giống như Generics trong C++/CLI.

+2

Hãy nhớ rằng C++/CX không giống như C++/CLI - thời gian chạy Windows không giống như CLR và có chức năng trong CLR không được hỗ trợ bởi winrt. Bạn không thể giả định rằng chức năng CLR sẽ hoạt động trong ứng dụng winrt C++/CX –

3

Theo như tôi biết, tùy ý, C++/CX Generics tùy ý không được hỗ trợ. C++/CX có thể sử dụng các giao diện tham số winrt, xuất hiện dưới dạng các đặc tả mẫu C++, nhưng các generics tùy ý không thể được xuất khẩu.

Bạn có thể tạo chuyên môn hóa các giao diện được tham số hóa từ không gian tên Windows :: Foundation, nhưng không phải là các giao diện tham số gốc (mẫu công khai).

+0

Có, đoạn thứ hai là đúng. –

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