2013-05-22 1 views
1

에 입력 할 수 있습니까?
클래스의 직렬화 및 비 직렬화를 수행하는 코드가 있습니다 ... 첫 번째 바이트는 클래스 유형을 인코딩하는 enum입니다. 모두 같은 기지에서 상속) .. 예.int (enum)을

Color* c; 
    auto classType == read_byte(buffer); 
    switch (classType) 
    case eBlue: 
    { 
     c = new Blue(buffer); 
    } 
    case eGray: 
    { 
     c = new Gray(buffer) 
    } 

//... 

유형에 열거에서지도를 할 수있는 방법은 내가 원시 PTR의 IRL을 사용하지 않을 것입니다 OFC 그래서 스위치를

c = new enum2Type(buffer); 

편집을 대체 할 수있다. :

+2

'표준 : :지도 '? – juanchopanza

+0

Google은 "가상 생성자"에 대해 몇 가지 아이디어를 제공합니다. –

+0

'관련'링크도 확인하십시오. http://stackoverflow.com/questions/4968691/c-create-object-of-certain-type-mapped-to-an-enum 및 http://stackoverflow.com/questions/4995378/c-template-for- 매핑 struct-type-to-enum –

답변

3
template<typename T> 
T* makeColor(Buffer const& buffer) 
{ 
    return new T(buffer); 
} 

... 

std::map<ColerEnum, Color* (*)(Buffer const&)> m; 
m[grayEnum] = makeColor<Gray>; 

... 

Color* c = m[typeByte](buffer); 
1

당신 스위치 매개 변수를 버퍼 매개 변수가있는 맵 또는 펑터 배열로 대체하여 Color에 대한 (스마트) 포인터를 반환 할 수 있습니다.

,210

다음

#include <functional> 
#include <map> 
... 

// if you are sure enum values start at 0 and increase withoug jumps, 
// you could use a plain array 
std::map<EnumType, std::function<Color*(const Buffer&)>> m; 

m[grayEnum] = make_stuff<Gray>; 
m[blueEnum] = make_stuff<Blue>; 

Color* c = m.at(classType); 
+0

네, 그래도 코드 중복을 피할 수는 없습니다 ... 일명 make_Blue make_Gray ... – NoSenseEtAl

+1

@NoSenseEtAl 함수 템플릿을 사용하여 중복을 저장할 수 있습니다. – juanchopanza

관련 문제