gpt4 book ai didi

c++ - 如何以通用方式从 std::istream 读取枚举

转载 作者:太空狗 更新时间:2023-10-29 23:07:55 26 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Input from stream to enum type

我有几个具有不同枚举的类作为类成员,我想从流中读取这些类。

以下代码显示了一个示例类:

  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 值(>> 没有模板)。

因此我创建了一个辅助类:

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;
};

现在我可以编写读取MyClass的代码如下:

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;
}

这已经离我想要的不远了,但仍然需要对 helper 类进行两次间接访问,不能将其写为临时类:

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 引用。

So here comes the question:

Can this be done easier without resorting to some temporaries and templates as done above?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com