c++ - 从派生结构初始化 const 父结构成员

标签 c++ struct constants

我正在编写一个结构层次结构,它们都派生自相同的基本结构。所述基本结构有一个标记字段,允许我识别其中的内容。现在我想自动初始化该字段,这样就没有错误,但不想为每个派生结构编写初始化程序。

我现在正在做的是使用一个中间代理结构来初始化基础代理结构。我的头文件的粗略浏览版本是:

enum class Tag
{
    Header ,
    Entry  ,

    Unknown = ~0
};

struct Chunk
{
    const Tag tag ;

    Chunk( Tag t = Tag::Unknown ) : tag( t ) {}
};

template< Tag TAG > struct ChunkProxy : public Chunk
{
    ChunkProxy( void ) : Chunk( TAG ) {}
};

struct HeaderChunk : public ChunkProxy< Tag::Header >
{
    int whatever = 0 ;
};

struct EntryChunk : public ChunkProxy< Tag::Entry >
{
    int somedata = 0 ;
};

我觉得在那里有那个 block 代理感觉不舒服,感觉可能有更好的方法来实现它;并且 chunk 本身不能是模板类,因为我不能通过指针传递它。

注意:我这样做是为了帮助我解析分块数据流,将从字符串中读取的内存直接映射到 pod 结构。

编辑:根据 Archie 的回答,我向 Chunk 添加了一个构造函数,并从 ChunkProxy 构造函数中删除了 const_cast。

最佳答案

为什么不给 Chunk 添加一个构造函数?

struct Chunk
{
    const Tag tag;

    Chunk() : tag(Tag::Unknown) {}
    Chunk(Tag tag) : tag(tag) {}
};

template<Tag TAG> struct ChunkProxy : public Chunk
{
    ChunkProxy(void) : Chunk(TAG) {}
};

实际上,使用此构造函数解决方案,您可以完全跳过 ChunkProxy:

struct Chunk
{
    const Tag tag;

    Chunk() : tag(Tag::Unknown) {}
    Chunk(Tag tag) : tag(tag) {}
};

struct HeaderChunk : public Chunk
{
    int whatever = 0;

    HeaderChunk(void) : Chunk(Tag::Header) {}
};

struct EntryChunk : public Chunk
{
    int whatever = 0;

    HeaderChunk(void) : Chunk(Tag::Entry) {}
};

关于c++ - 从派生结构初始化 const 父结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349153/

相关文章:

C++:工厂设计,不能在 vector 上 push_back

c++ - 在 C++ 中传递包含静态数组的结构

static - 在 Flutter 中保留所有常量的最佳做法是什么?

跨越多行的 PHP 类常量字符串变量

c# - C# 中的 char (C++) 操作

c++ - boost python,使用 main global 以外的命名空间

c++ - 删除存储了多个引用的指针

谁能解释一下,这个结构初始化实际上是如何工作的?

可区分联合的结构属性

c# - 在 C# 中声明一个 const double[]?