C++ 从派生结构初始化常量父结构成员

C++ 从派生结构初始化常量父结构成员,c++,struct,constants,C++,Struct,Constants,我正在编写一个结构层次结构,所有结构都派生自同一个基本结构。所说的基本结构有一个标记字段,允许我识别其中的内容。现在,我想自动初始化该字段,这样就不会出现错误,但我不想为每个派生结构编写初始值设定项 我现在要做的是使用一个中间代理结构来初始化基础结构。我的头文件的重读版本是: enum class Tag { Header , Entry , Unknown = ~0 }; struct Chunk { const Tag tag ; Chunk(

我正在编写一个结构层次结构,所有结构都派生自同一个基本结构。所说的基本结构有一个标记字段,允许我识别其中的内容。现在,我想自动初始化该字段,这样就不会出现错误,但我不想为每个派生结构编写初始值设定项

我现在要做的是使用一个中间代理结构来初始化基础结构。我的头文件的重读版本是:

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 ;
};
enum类标记
{
标题,
进入
未知=~0
};
结构块
{
常量标签;
Chunk(Tag t=Tag::Unknown):Tag(t){}
};
模板struct ChunkProxy:public Chunk
{
ChunkProxy(void):块(标记){}
};
struct HeaderChunk:public ChunkProxy
{
int=0;
};
struct EntryChunk:public ChunkProxy
{
int-somedata=0;
};
我觉得有块代理不舒服,感觉可能有更好的方法来实现这一点;块本身不能是模板类,因为我不能通过指针传递它

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


编辑:根据阿尔奇的回答,我已经在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) {}
};

为什么不在
块中添加构造函数呢

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

真正的事情有点复杂。我特别想避免在每个子结构(有很多子结构)中添加构造函数。@DiegoSánchez如果你想避免这种情况,那么
ChunkProxy
(但名称更好,可能是
ChunkTraits
?)就是一种方法。只是不要做这个
const_cast
的事情,因为它引入了一个UB。const_cast的优点是,为了使示例能够编译,匆忙添加了它。会改变的。真正的事情有点复杂。我特别想避免在每个子结构(有很多子结构)中添加构造函数。@DiegoSánchez如果你想避免这种情况,那么
ChunkProxy
(但名称更好,可能是
ChunkTraits
?)就是一种方法。只是不要做这个
const_cast
的事情,因为它引入了一个UB。const_cast的优点是,为了使示例能够编译,匆忙添加了它。我会改变的。