2012-06-24 2 views
3

가능한 중복을 성병 :: istream로부터 열거를 읽기 :
Input from stream to enum type어떻게 일반적인 방식으로

I 클래스 구성원으로서 다른 열거 여러 수업을 내가 읽고 싶은 스트림으로부터의 클래스

다음 코드

가 실시 클래스를 보여줍니다 수 없습니다

enum enSide{ 
    eLeft, 
    eRight 
    }; 

    enum enType{ 
    eConUndefined, 
    eConRoom  
    }; 

    class MyClass{ 
    public: 
     friend std::istream& operator>>(std::istream& in, MyClass& val) { 
     in >> val.mSide >> val.mType >> val.mTargetId;   
     return in;  
     } 

     MyClass(){} 

    private: 
     enSide mSide; 
     enType mType; 
     int mTargetId; 
    }; 

불행하게도 이것이 enum 값에 직접 읽기 때문에 작동하지 않습니다 (대한 템플릿 없습니다 >>). 여전히 필요

friend std::istream& operator>>(std::istream& in, MyClass& val) { 
    ScanTo<enSide> scanside(val.mSide); 
    ScanTo<enType> scantype(val.mType); 
    in >> scanside >> scantype >> val.mTargetId;   
    return in;  
} 

이 내가 원하는 것을에서 멀지 않은 이미하지만 다음과 같이 MyClass를 읽는

template<class ENUM> 
class ScanTo{ 
    public: 
    friend std::istream& operator>>(std::istream& in, ScanTo<ENUM>& eval) { 
     unsigned int val; 
     in >> val; 
     eval.mrEnum = static_cast<ENUM>(val); 
     return in;  
    } 

    ScanTo(ENUM& eRef):mrEnum(eRef){} 

    private: 
    ENUM& mrEnum;  
}; 

지금 내가 코드를 작성할 수 있습니다

따라서 나는 헬퍼 클래스를 생성 도우미 클래스에 대한 두 가지 방향은 임시로 쓸 수 없습니다.

friend std::istream& operator>>(std::istream& in, MyClass& val) { 
in >> ScanTo<enSide>(val.mSide)>> ScanTo<enType>(val.mType) >> val.mTargetId;   
return in;  
} 

은 컴파일시 (gcc 4.43)이 아니기 때문에 임시로 비 const 참조가 주석에서 지적 된 것처럼 금지되어 있습니다.

이 위에서 수행 일부 임시직 및 템플릿에 의존하지 않고 쉽게 수행 할 수 있습니다

그래서 여기에 질문을 온다?

+0

본 적이 있습니까? http://stackoverflow.com/questions/5633784/input-from-stream-to-enum-type – kol

+1

압축 된 버전은 내 VS2010과 완벽하게 통합되어 작동합니다. 어떤 컴파일러를 사용하고 있습니까? –

+1

@dionadar VS가 비 임시 ('myClass & val')에 대한 참조를 확장을 통해 임시 바인딩 ('ScanTo (val.mSide)')에 허용한다고 생각합니다. 그것은 비표준이지만. – jrok

답변

1

나는 당신이 도우미 함수 템플릿을 쓸 수 있습니다 생각 :

template <class T> 
std::istream& operator >>(std::istream& is, T& t) 
{ 
    int i; 
    is >> i; 
    t = (T)i; 
    return is; 
} 

in >> val.mSide >> val.mType >> val.mTargetId; 

가능하게한다.

+1

이것은 임의의 유형으로 트리거 될 수 있기 때문에 당신을 죽입니다. 사용자 정의 유형에 대해 연산자 >>를 정의하는 것을 잊어 버렸지 만 어쨌든 사용하십시오. 코드가 컴파일되지만 int를 사용자 정의 유형으로 유형 변환합니다 – Martin

0

가장 좋은 방법은 데이터 멤버를 int으로 정의하고 유형 안전 접근자를 사용하여 설정하고 검색하는 것입니다.

class MyClass{ 
    public: 
    friend std::istream& operator>>(std::istream& in, MyClass& val) { 
     in >> val.mSide >> val.mType >> val.mTargetId;   
     return in;  
    } 

    MyClass(){} 

    enSide side() const { return static_cast<enSide>(mSide); } 
    void side (enSide v) { mSide = v; } 

    enType type() const { return static_cast<enType>(mType); } 
    void type (enType v) { mType = v; } 

    int targetId() const { return mTargetId; } 
    void targetId (int v) { mTargetId = v; } 

    private: 
    int mSide; 
    int mType; 
    int mTargetId; 
}; 

이렇게하면 원하는 임시 파일을 피할 수 있습니다.

관련 문제