ジェネリックの使用 (C++/CLI)
ある .NET (または UWP) 言語で作成されたジェネリックを、他の言語で使用できます。 テンプレートとは異なり、コンパイル済みのアセンブリ内のジェネリックは、ジェネリックのままです。 したがって、ジェネリック型が定義されたアセンブリとは別のアセンブリと別の言語で、ジェネリック型をインスタンス化できます。
例: C# で定義されたジェネリック クラス
この例では、C# で定義されるジェネリック クラスを示します。
// consuming_generics_from_other_NET_languages.cs
// compile with: /target:library
// a C# program
public class CircularList<ItemType> {
class ListNode {
public ItemType m_item;
public ListNode next;
public ListNode(ItemType item) {
m_item = item;
}
}
ListNode first, last;
public CircularList() {}
public void Add(ItemType item) {
ListNode newnode = new ListNode(item);
if (first == null) {
first = last = newnode;
first.next = newnode;
last.next = first;
}
else {
newnode.next = first;
first = newnode;
last.next = first;
}
}
public void Remove(ItemType item) {
ListNode iter = first;
if (first.m_item.Equals( item )) {
first =
last.next = first.next;
}
for ( ; iter != last ; iter = iter.next )
if (iter.next.m_item.Equals( item )) {
if (iter.next == last)
last = iter;
iter.next = iter.next.next;
return;
}
}
public void PrintAll() {
ListNode iter = first;
do {
System.Console.WriteLine( iter.m_item );
iter = iter.next;
} while (iter != last);
}
}
例: C# で作成されたアセンブリを使用する
この例では、C# で作成されたアセンブリを使用します。
// consuming_generics_from_other_NET_languages_2.cpp
// compile with: /clr
#using <consuming_generics_from_other_NET_languages.dll>
using namespace System;
class NativeClass {};
ref class MgdClass {};
int main() {
CircularList<int>^ circ1 = gcnew CircularList<int>();
CircularList<MgdClass^>^ circ2 = gcnew CircularList<MgdClass^>();
for (int i = 0 ; i < 100 ; i += 10)
circ1->Add(i);
circ1->Remove(50);
circ1->PrintAll();
}
この例では、次の出力が生成されます:
90
80
70
60
40
30
20
10