2009-05-18 2 views
3

D programming language에 사용자 정의 유형 (구조체 또는 클래스)에 대한 고유 핸들로 사용할 수있는 무언가를 생성해야합니다. 바람직하게는 컴파일 타임 계산 가능 값이됩니다. 유형의 내부 구조 (데이터 레이아웃)가 변경되었지만 동일한 유형을 다른 응용 프로그램으로 컴파일하는 것을 포함하여 대부분의 다른 편집에 대해 동일하게 유지되면 핸들을 변경하고 유형의 이름과 관련시켜야합니다.D에서 사용자 정의 유형을 고유하게 식별하는 방법은 무엇입니까?

이 내 현재의 생각은 형식 이름의 MD5 해시 및 회원 유형 및 이름과 같은 문자열을 사용하는 것입니다

보안은 무시하기 어려운 일 필요는 없습니다, 그래서 일 또는 아무것도 아니다 .

어떤 생각

답변

1

조금 이것에 대해 생각하면, 나는 이것이 가능한 방법이 될 것이라고 생각

입니다
UniqueId(Type) = Type.stringof ~ MemberIds!(Type.tupleof) 

UniqueId(Type) if(Type is builtin) = Type.stringof 

MemberIds(M, Ms...) = "," ~ UniqueId!(typeof(M)) 
         ~ "@" ~ ToString!(M.offsetof) 
         ~ ":" ~ M.stringof 
         ~ MemberIds!(Ms) 

는, (유형의 이름에서 당신을 고유 ID를 생성 확실하지 않은 모듈과 패키지를 잘라야 할 수도 있음), 각 멤버의 ID, 오프셋 및 이름.

정확하게 원하는대로 멤버 이름을 삭제할 수 있습니다.

+0

그건 내 생각보다 더 많거나 적습니다. (+1) OTOH 나는 여전히 훌륭한 해결책을 원합니다. . – BCS

0

typeid expression는 소속 카테고리 객체의 고유 인스턴스를 반환합니다. 이론적으로 TypeInfo 객체의 주소를 유형의 고유 식별자 값으로 사용할 수 있어야합니다.

+0

두 가지 문제가 있습니다. DLL에서는 작동하지 않으며 컴파일 시간 값이 아닙니다. – BCS

0

당신은 "const REV = 173;"과 같은 유형으로 개정판을 하드 코딩 한 다음 레이아웃을 변경할 때마다 개정판을 업데이트 한 다음이를 유형 이름과 혼합하여 식별자를 생성 할 수 있습니다.

이것은 수동 업데이트가 필요하기 때문에 조금 번거 롭지만 svn diff가 해당 클래스의 변경 사항을 인식 할 때 커밋시 자동으로 업데이트되도록 스크립트 할 수 있습니다. 아마도 가장 쉬운 해결책 일 것입니다. (이 그냥 의사 코드는 주) :

+0

그 유형을 편집 할 수 있어야합니다. 나는 내 경우에 그것을 의지 할 수 없다. 또한 나는/my/users에게 그렇게하도록 요구할 것이다. – BCS

1

유형의 정규화 된 이름은 고유해야합니다. 이는 typeid (T) .toString과 동일합니다. 이것은 이 아니며과 동일합니다. T.stringof는 템플릿 인스턴스를 지우고 정규화 된 이름을 제공하지 않습니다.

해결 방법은 런타임에 compiletime 및 typeid (T) .toString에서 demangled (T.mangleof)를 사용하는 것입니다.

+0

유용한 정보! 생각해 보면, 나는 그 mangle을 사용할 수있을 것 같아. 회원들의 변화를 알 수는 없지만 그렇게 할 수는 있습니다. – BCS