0

我有一个用于标记字节流(std::vector<uint8_t>)的结构。该流可以包含字节、字、双字、以空结尾的字符串和原始数据。

struct Token {
    enum TokenClass {
        BYTE, WORD, INT, SZCHAR, DATA
    };

    TokenClass type;
    boost::any value;

    Token( TokenClass c, uint8_t b ) : type(c), value(b) { }
    Token( TokenClass c, uint16_t w ) : type(c), value(w) { }
    ... etc.
};

它似乎工作到我尝试检查单元测试中的值的地步。

IE:

// ts is of type std::vector<Token>
CHECK_EQUAL(Token::WORD, ts[0].type); // fine
CHECK_EQUAL(257, ts[0].value); // error!

给出一个错误

错误:'operator==' 不匹配(操作数类型是 'const boost::any' 和 'const int') if (!(expected == actual))

所以我在类中添加了一个比较器,仅用于 int:

bool operator==(const int rhs) const
{
    return boost::any_cast<int>(value) == rhs;
}

但这并没有缓解这个问题。

我如何将底层类型与值进行比较,因为一旦我开始验证代码,我就需要能够比较值。

也将更boost::variant适合我需要做什么?在我对两者的快速阅读中,它似乎any更适合我的任务。

4

0 回答 0