我正在编写一个结构层次结构,它们都来自相同的基本结构。所述基础结构具有标记字段,允许我识别其中的内容。现在我想自动初始化该字段,这样就没有错误,但是不想为每个派生结构编写初始化器。
我现在正在做的是使用中间代理结构来初始化基础结构。我头文件的浏览量很大:
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 ;
};
我觉得在那里有那个块代理感觉不舒服,感觉可能有更好的方法来实现这个目标;并且chunk不能是模板类本身,因为我无法通过指针传递它。
注意:我这样做是为了帮助我解析分块数据流,将从字符串读取的内存直接映射到pod结构。
编辑:根据Archie的回答,我已经向Chunk添加了一个构造函数,并从ChunkProxy构造函数中删除了const_cast。
答案 0 :(得分:1)
为什么不向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) {}
};