2016-09-23 6 views
0

나는 다양한 종류의 클래스 이름을 얻기 위해 typeid(ClassName).name()을 사용합니다. 그러나 길이를 고정해야합니다 (예 : 8 자). 많은 경우 클래스는 네임 스페이스에 있으므로 문자열이 너무 길어지고 처음 10 자만 있으면 작동하지 않습니다.픽스 크기의 클래스 이름 문자열을 얻는 방법

누구나 문자열을 고정 크기 문자열로 코딩/디코딩하는 좋은 방법을 알고 있습니까? 나는 맵에 접근 할 수없는 다른 머신으로 문자열을 보낼 것이기 때문에 실제로 hash_code를 이름으로 매핑하는 테이블을 유지할 수는 없다.

template <typename ClassType> char* get_name(){ 
     return typeid(ClassType).name(); // ?? 
} 
+0

압축 알고리즘을 찾아야 할 것 같습니다. 그게 가능한지 모르겠다. – alain

+2

이것은 [XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 비슷합니다. – molbdnilo

+0

@molbdnilo typeid를 사용하는 방법 이외의 다른 방법을 알고 있다면 기꺼이 알게 될 것입니다. –

답변

0

일반적으로 임의 길이의 문자열을 고정 된 도메인에 매핑하는 기능을 빌드 할 수 없습니다. 이는 pigeonhole principle을 위반합니다.

다음 제안은 너무

로,

당신이 당신의 이름을 실행할 통해 클래스를 구축한다고 가정 ... 상당히 복잡한 내게 보이지만 문제에 큰 맥락의 부족을 주어 간다

두 멤버가 있습니다. 시드를 취하는 ctor와 이름 문자열을 가져 와서 8 자 키 문자열을 반환하는 operator()입니다. 코드에서 고정 된 임의의 시드로이 객체를 초기화합니다.

내부적으로 클래스 개체는 적용된 각 고유 이름에 대해 매핑 된 키인 unordered_map을 보유해야합니다. 처음에는 분명히이 내부 unordered_map이 비어 있습니다.

클래스 개체는 생성자에서 seed에 의해 무작위로 선택된 universal hash function을 사용해야합니다. 보편적 인 해시 함수를 작성하는 한 가지 방법에 대한 답변은 this question을 참조하십시오.

연산자가 호출되면 내부 이름이 unordered_map인지 확인해야합니다. 그렇다면, 발견 된 키를 리턴하십시오. 그렇지 않으면 먼저 해시 함수를 사용하여 키를 계산하고 내부에 넣으십시오 unordered_map. 그러나 새 키를 생성 할 때 기존 키와 충돌하는지 확인하고 예외가 있으면 예외를 throw합니다. 각각의 고유 한 이름은 당신이 typeid 전화 코드의 한 자리에 해당하기 때문에

이 현실적으로, 말하기, 서로 다른 이름의 수는 N 대부분에서의 1000에 있어야합니다 말한다. m을 8 문자 (2)와 가능한 범위로 설정하십시오.

충돌 확률은 ~ n/(2m)입니다. 이는 작아야합니다. 따라서 대부분의 경우 충돌이없고 예외가 발생하지 않습니다. 그러나 던져지면 시드를 바꾸고 프로그램을 다시 빌드하십시오. 예상되는 횟수는 처음 시간 이후에 0에 가깝습니다.