C++ 具有互斥数据成员的对象的设计备选方案

C++ 具有互斥数据成员的对象的设计备选方案,c++,design-patterns,c++14,C++,Design Patterns,C++14,很难在标题中概括这个问题;因此,请允许我在此澄清情况 我正在设计一个类,它代表一个。在本规范中,TLV的“数据”部分可以包含原始数据字节或其他嵌套TLV。为了支持这两种形式,我使用了相同的结构,但有两个向量(只有一个向量实际包含某些内容,这取决于我们在解析TLV数据时发现的内容): 但是,我担心这会对std::uint8\t案例产生负面影响,因为这实际上只是字节数据。它现在也将变得不连续。该变体仅对嵌套的TLV案例有利,没有太多好处 接下来,我考虑在这里使用visitor模式,但我不能很好地想象

很难在标题中概括这个问题;因此,请允许我在此澄清情况

我正在设计一个类,它代表一个。在本规范中,TLV的“数据”部分可以包含原始数据字节或其他嵌套TLV。为了支持这两种形式,我使用了相同的结构,但有两个向量(只有一个向量实际包含某些内容,这取决于我们在解析TLV数据时发现的内容):

但是,我担心这会对std::uint8\t案例产生负面影响,因为这实际上只是字节数据。它现在也将变得不连续。该变体仅对嵌套的TLV案例有利,没有太多好处

接下来,我考虑在这里使用visitor模式,但我不能很好地想象界面会是什么样子,或者这将如何提高这两种情况下的可用性(原始数据与嵌套TLV)。visitor是正确的解决方案吗

到目前为止,我所想到的没有什么是正确的,所以我希望能得到反馈,找到更好的设计方法来解决这个问题。这里的一般问题是数据成员有时未使用或相互排斥。这也是我在其他环境中遇到的一个问题,所以对于这样一个问题有一个通用的设计方法将是非常好的

请注意,我可以访问C++14及以下功能

基本上,他们必须检查m_data.empty(),如果是,则使用m_nestedTlvs


如果一个对象要么有一个字节数组,要么有一个其他对象数组,那么这就是您应该使用的变量:
variant
variant
s的
vector
与您指定的用例不匹配。

您是否考虑过使用单个字节向量加上引用向量部分的树来代替两个不同的值向量?@VaughnCato:您指的是引用向量中偏移的树?我不明白当你最终得到一个复杂的嵌套TLV树时,这是怎么回事。这个类的部分职责是从用户那里抽象出“字节数组”,并提供完整、可用的类型和对象。还希望避免解析后期构造。不知道联合{std::vector m_data;std::vector m_nestedTlvs;}内容有什么问题;记住enumI之外的enum中的实际类型,就错误地假设
variant
是由C++14提供的,但它不是。它是C++17的一部分。所以我猜variant是不可能的。
boost::variant
?@void.pointer:除了boost之外,还有很多
variant
的实现。@nicolas例如?
class BerTlv
{
public:

    void Parse(std::vector<std::uint8_t> const& bytes_to_parse);

    // Assume relevant accessors are provided

private:

    // Will be m_data or m_nestedTlvs, but never both
    std::vector<std::uint8_t> m_data;
    std::vector<BerTlv> m_nestedTlvs;
};
std::vector<std::variant<BerTlv, std::uint8_t>> m_data;