【发布时间】:2019-09-01 17:43:17
【问题描述】:
我有一个文件处理程序,用于读取和写入自定义二进制文件。为了节省自己的工作,我从一个基本结构 (base_p) 继承了多个数据:
struct base_p{
protected:
uint32_t v0= 0;
uint32_t v1= 0;
uint32_t v2= 0;
friend struct f_block;
// other friends
};
现在在构建该文件的内部块期间,我将该结构继承到多个非 POD 类型中:
struct f_block:public base_p{
f_block(){
this->v0 = 0x3f580058; // an magic number of the block
this->v1 = 0x1000004D; // version and use type
this->v2 = 0;
}
f_block(uint32_t data){
this->v0 = 0x3f580058; // an magic number of the block
this->v1 = 0x1000004D; // version and usage type
this->v2 = data;
}
operator uint8_t(){ return this->v1 & 0xff; }
operator bool(){return this->v2 != 0 ;}
friend std::ostream& operator<<( std::ostream& os, f_block& fb );
};
std::ostream& operator<<( std::ostream& os, f_block& fb ){
union {
uint32_t vrt;
unsigned char parts[4];
}temp;
temp. vrt = fb. v2;
return os << temp. parts[3] << temp. parts[2] << temp. parts[1] << temp. parts[0];
}
在我的文件处理程序中,我使用了这两种结构。例如,如果我需要在某处传递数据,我需要将数据提取为base_p。但是我的块定义有一个额外的功能,usage 服务和压缩密钥,在data (v2) 中,我还存储了一些信息,例如从末尾的位偏移量、特征块的长度。 . .和许多其他人。所以提取函数看起来有点像:
struct file_handler{
std::vector<base_p> data;
file_handler():data(0){}
virtual bool read(const char *filename) = 0; // to be overridden
virtual bool write(const char *filename)= 0; // to be overridden
virtual bool set( base_p &data){
// if data is base_p , push_back data as normal POD
// if data is f_block, push_back data as deflated version
// don't store anything in vector if none
}
virtual bool get( base_p &data){
// if data is base_p, returns lasts 3 elements v2(data) fields
// if data is f_block, returns last element as f_block - inflated,
// set data as 0 if none
}
}
我试图捕捉调用base_p 中不存在的函数的错误,但它不适合我,因为我在应该接受其他数据类型的file_handler 结构上构建多个文件处理程序.一旦我能够成功实现file_handler,我就足够安全地开始构建其他文件类型。我需要的是数据类型 switch 语句。
由于我来自python 背景,我可以在其中做一些类似于isinstance 或类似的事情。但这是 C++,所以没有这样的实现 - 我知道。
我已经搜索并发现了一些似乎有可能解决我的问题的元素,但它们中的大多数都是过时的版本,或者太抽象而无法将我的头脑包裹起来以生成逻辑解决方案。
- SFINAE and void :提到 SFINAE 遵循的某种 concept,以及 compound 概念,这对我来说太抽象了,无法成功地进行有效实施。
-
HasMember SFINAE :这对于构造函数识别似乎是可行的,但最好的答案写在
c++03中,没有提及它是否转换为c++11也就是我目前使用的版本。
有没有办法区分 POD 和非 POD?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。