初めてのC++/CLIその2

基本からということで文字列と配列について実験です。

#include "stdafx.h"

using namespace System;
using namespace System::Runtime::InteropServices;
using namespace std;

// arrayやpin_ptrを使うのに必要
using namespace stdcli::language;

void test_string() 
{
  // ネイティブな文字列
  char* native = "Hello";
  printf("native %s.\n", native);

  // マネージドな文字列に変換
  String^ managed = Marshal::PtrToStringAnsi(static_cast<IntPtr>(native));
  Console::WriteLine("managed {0}.", managed);

  // ネイティブな文字列に変換
  IntPtr h = Marshal::StringToHGlobalAnsi(managed);
  printf("nateive %s again.\n", h.ToPointer());
  // 領域を開放
  Marshal::FreeHGlobal(h);
}

void print_array(array<int>^ iarr)
{
  for (int i = 0; i < iarr->Length; ++i) 
    Console::Write(iarr[i].ToString()->PadLeft(4));
  Console::WriteLine();
}

void test_array() 
{
  Random^ r = gcnew Random;
  array<int>^ iarr = gcnew array<int>(10);
  for (int i = 0; i < iarr->Length; ++i) 
    iarr[i] = r->Next(999);

  // ソート前
  print_array(iarr);

  // 配列のポインタを取得し、固定
  pin_ptr<int> pp = &iarr[0];
  int* p = pp;
  // STLのsortを呼び出す
  sort(p, p + iarr->Length);

  // ソート後
  print_array(iarr);
}

int _tmain()
{
  test_string();
  test_array();

  Console::ReadLine();
}

/* 結果
native Hello.
managed Hello.
nateive Hello again.
 661 283 997 659 370 329 712 990 195 477
 195 283 329 370 477 659 661 712 990 997*/

C++/CLI仕様書のドラフト見ながら弄っていたのですが、for eachが無かったり微妙に表記が変わったりしてます。Managed C++よりはずっと良くなっていますがC#2.0を弄った後だとIteratorやAnonymous Methodが無いのが不満に感じますね。