2009-03-25 28 views
8

Tôi có lớp sau trong C++/CLI và một mẫu instantiation rõ ràng cho int nguyên thủy ..Sử dụng C++ CLI mẫu lớp trong C#

template<typename T> 
public ref class Number 
{ 
    T _value; 
public: 
    static property T MinValue 
    { 
     T get() 
     { 
      return T::MinValue; 
     } 
    } 

    static property T MaxValue 
    { 
     T get() 
     { 
      return T::MaxValue; 
     } 
    } 

    property T Value 
    { 
     T get() 
     { 
      return _value; 
     } 

     void set(T value) 
     { 
      if(value<MinValue || value > MaxValue) 
       throw gcnew System::ArgumentException("Value out of range"); 

      _value = value; 
     } 
    } 

}; 

template ref class Number<int>; 

On biên dịch này và kiểm tra việc tạo lắp ráp sử dụng phản xạ tôi có thể để xem một lớp được gọi là Number<int> nhưng trong khi cố gắng để khởi tạo cùng một lớp này trong C# trình biên dịch phàn nàn về một số lớp System::Number không tham gia một đối số mẫu. Tôi đang làm gì sai? Điều này có thể được thực hiện ở tất cả?

Trả lời

10

Tôi có một công việc xung quanh, tuyên bố một lớp bổ sung kế thừa lớp Number<int>. Lớp này bây giờ có thể nhìn thấy trong C# và có thể được khởi tạo.

public ref class MyInt32 : public Number<int> 
{ 
}; 
1

Nếu mục tiêu của bạn là tạo ra một loại parametrized trong C++ CLI, và sau đó sử dụng loại từ C#, tôi nghĩ rằng bạn cần phải tạo ra một kiểu generic chứ không phải là một kiểu mẫu (xem Stan Lippman's Blog vì những lý do tại sao cả hai phương pháp đều tồn tại). Xem here để biết thông tin về cách tạo kiểu chung trong C++ CLI.

+0

Đáng buồn thay, việc tạo các kiểu generic đánh bại toàn bộ mục đích của việc sử dụng C++/CLI vì C# có thể thực hiện tương tự và không hiệu quả như nhau. –

+0

Sau đó, nó có vẻ như câu trả lời bạn đăng là cách duy nhất để đi (mặc dù phần nào đánh bại mục đích của việc sử dụng các mẫu, quá). Như @JaredPar đã nói, các mẫu không giống như generics, và chỉ C++ có thể sử dụng các mẫu. – Andy

9

Phản xạ là nằm một chút ở đây. Tên của lớp không thực sự là số <int>. Nó thực sự là 'Số <int>'. Lưu ý các dấu nháy đơn. Đây chỉ hiển thị khi bạn xem tên kiểu với ildasm.

I tin điều này được thực hiện để làm cho loại không thể tiếp cận trong hầu hết các ngôn ngữ vì chúng không có cách nào hiểu được cách mẫu C++ thực sự hoạt động. Điều này làm cho nó có hiệu quả chỉ hiển thị cho trình biên dịch C++ là thích hợp vì nó là trình biên dịch MS duy nhất mà thực sự hỗ trợ các mẫu (templates! = Generics).

+0

Và tôi nghĩ rằng các mẫu C++/CLI có một công cụ sửa đổi được yêu cầu trên chúng, ildasm cũng cho thấy điều đó. CLI cấm các công cụ không hiểu một công cụ sửa đổi bắt buộc để sử dụng thành viên. –

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