2010-01-18 1 views
4

우리는과 같이, 구조체의 STL 벡터를 포함하는 구조체를 사용하는 C++ 라이브러리가 : 나는 도서관에 대한 CLI 래퍼를 쓰고 있어요값으로 전달되는 List (또는 유사)를 포함하는 CLI 값 클래스를 어떻게 만듭니 까?

struct Params 
{ 
    // values... 
} 

struct Settings 
{ 
    std::vector<Params> m_params; 

    // values... 
} 

을, 나는 위의 구조체 유형의 등가물을 원한다. 그래서 같이 벡터의 동등 목록을 사용하여에 대해 생각했다 :

public value struct Params 
{ 
    // values... 
} 

public value struct Settings 
{ 
    List<Params>^ Params; 

    // values... 
} 

그러나 목록 <T> 이후

목록은 참조가 아닌 값에 의해 주위에 전달되는, 참조 형식입니다. 나머지 구성원과 함께 값으로 전달되는 목록 (또는 비슷한)을 포함하는 CLI 클래스를 만드는 방법이 있습니까?

+0

"하지만'List'는 값 유형이므로"List "는 값 유형이 아닌 참조 유형입니다. –

+0

@Mehrdad : 감사합니다. 감사합니다. 결정된. – Simon

답변

1

저는 mcdave의 답변에 동의합니다. 귀하가 묻는 것은 지원되지 않습니다.

나는 당신의 주요 포인트는 얻을 수없는 것을 추측하고 실제 통과별로 가치,하지만 더 얻을 패스에 의해 값 행동. System.String을 생각해보십시오. 이것은 실제로 값 유형이 아니지만 문자열을 수정할 수 없기 때문에 안전하게 참조를 전달할 수 있습니다. 새 문자열 만 만들 수 있습니다.

IList<Param>의 속성으로 만들 수 있습니다. 할당 할 때 내용을 새로운 List<Param>으로 복사하고 AsReadOnly()을 호출 할 때 IList 포인터를 저장하십시오. 이제부터 IList은 수정할 수없는 개체를 가리 킵니다. struct가 value에 의해 전달되면, 포인터는 복사 될 것이지만, 그것은 불변의 것을 가리키기 때문에 괜찮습니다. 객체가 많이 전달되면 더 빠를 것입니다. 매번 deepcopy가 필요하지 않기 때문입니다.

+0

당신은 꽤 옳습니다. 문자열과 동등한 행동으로 충분할 것입니다. – Simon

1

복사 생성자와 같은 "값 형식에 사용자 정의 특수 멤버 함수를 포함 할 수 없습니다"(from C3417) 때문에 값으로 설정 클래스를 전달할 수 있다고 생각하지 않습니다.

당신은 사용하여 비슷한 효과를 얻을 수 있습니다 : 당신의 C# 코드에서

public value struct Settings : public ICloneable 
{ 
    List<Params>^ m_params; 

    virtual Object^ Clone() 
    { 
     Settings^ rv = gcnew Settings(); 
     rv->m_params = gcnew List<Params>(); 
     rv->m_params->AddRange(m_params->ToArray()); 
     return rv; 
    } 
} 

을 당신은 그 것이다 : 당신에 의해 패스 얻을 Settings settings1 = settings2; 스타일의 구문만큼 깨끗

Settings s1, s2; 
// ... some code modifying s1 
s2 = (Settings)s1.Clone(); 

값.

0

어때 대략 List<Params>^% Params;List<Params%>^% Params;?

관련 문제