2014-08-11 2 views
4

나는 C++/CLI의 매개 변수가 있습니다.변환 C++/CLI 문자열 배열

어떻게해야합니까? 내가 원하는 C++/CLI만큼 좋지 않습니다.

+0

당신은 또한 스레드 로케일의 문자 세트 및 인코딩에 유니 코드 문자 세트로 변환 하시겠습니까 (코드가 실행될 때)? 그렇게 생각하지 않는 것이 일반적인 경우 일 수 있습니다. 그러나 데이터가 NTFS 파일 이름 (예 :) 인 경우 유니 코드로 보관해야합니다. –

답변

4

MSDN은 데이터를 마샬링하는 방법에 대해 자세히 설명합니다. 또한 msclr::marshal_as w.r.t에 대한 표준 구현을 제공합니다. std::string.

cli::array은 좀 더 복잡합니다. 일반적인 경우의 핵심은 배열 pin입니다 (따라서 우리는 뒤에서 움직이지 않습니다). String^ 변환의 경우 marshal_aspinString이 적합합니다.

코드의 요점은 다음과 같습니다

vector<string> marshal_array(cli::array<String^>^ const& src) 
{ 
    vector<std::string> result(src->Length); 

    if (src->Length) { 
     cli::pin_ptr<String^> pinned = &src[0]; // general case 
     for (int i = 0; i < src->Length; ++i) { 
      result[static_cast<size_t>(i)] = marshal_as<string>(src[i]); 
     } 
    } 

    return result; 
} 
+2

왜 src 배열을 고정해야합니까? –

+0

@AlexFarber 코드는 원래 배열의 형식에 맞게 템플릿 화되었으므로 일부 형식이 알려지지 않았고 코드에서 변환 중에 이동하지 않았 음을 확인해야했습니다. 이 경우 marshal_as가 사용되므로이 경우 엄격하게 필요하지 않을 수도 있습니다. 다시 점검해야합니다. 관리 대상에서 비 관리 대상으로 변환하려면 데이터를 복사하는 동안 관리 대상 개체를 메모리에서 이동하지 않아야합니다. – Niall

+1

고정은 여기서 필요하지 않습니다.이 코드는 String 배열의 일반적인 열거를 만듭니다. 더러운 모든 작업은 문자열을 내부적으로 고정하는 marshal_as에 의해 식사됩니다. –