我正在编写一个结构层次结构,它们都派生自相同的基本结构。所述基本结构有一个标记字段,允许我识别其中的内容。现在我想自动初始化该字段,这样就没有错误,但不想为每个派生结构编写初始化程序。
我现在正在做的是使用一个中间代理结构来初始化基础代理结构。我的头文件的粗略浏览版本是:
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/