c++ - 库类型的析构函数是否定义良好?
问题描述
例如iterator
类型 - 这里我需要有一个不同类型的多态迭代器,具体取决于使用情况。所以我用用户定义的构造函数和析构函数创建了一个联合:
我特别质疑析构函数的名称(例如。~iterator()
)。
#include <list>
#include <string>
struct val_origin {
union {
std::list<std::list<std::string>>::iterator iterenum;
std::list<std::list<std::list<struct var>>>::iterator iterunorstr;
std::list<struct var>::reverse_iterator vartypedef;
};
enum ORIG_ENUM {
ORIG_ENUM_TYPE,
ORIG_STRUC_TYPE,
ORIG_TYPEDEF,
ORIG_PLAIN
} orig;
val_origin(ORIG_ENUM orig) {
switch (orig) if (0)
case ORIG_ENUM_TYPE:
new (&iterenum)decltype(iterenum) {};
else if (0)
case ORIG_STRUC_TYPE:
new (&iterunorstr)decltype(iterunorstr) {};
else if (0)
case ORIG_TYPEDEF:
new (&vartypedef)decltype(vartypedef) {};
}
val_origin& operator=(const val_origin& val_origin_in) {
this->~val_origin();
new (this)val_origin{ val_origin_in };
}
val_origin(const val_origin& val_origin) {
switch (orig) if (0)
case ORIG_ENUM_TYPE:
iterenum = val_origin.iterenum;
else if (0)
case ORIG_STRUC_TYPE:
iterunorstr = val_origin.iterunorstr;
else if (0)
case ORIG_TYPEDEF:
vartypedef = val_origin.vartypedef;
}
~val_origin() {
switch (orig) if (0)
case ORIG_ENUM_TYPE:
iterenum.decltype(iterenum)::~iterator();
else if (0)
case ORIG_STRUC_TYPE:
iterunorstr.decltype(iterunorstr)::~iterator();
else if (0)
case ORIG_TYPEDEF:
vartypedef.decltype(vartypedef)::~reverse_iterator();
}
};
现在我的问题是上面的代码在gcc上编译得很好。但是当我切换到 clang 或 MSVC 时它失败了。
我的问题是这是否是标准代码(希望从标准中引用,我无法找到相关信息),如果不是,我实现此代码的其他选择是什么。
我正在尝试拥有一个动态(运行时)多态迭代器(相同的对象但不同类型的迭代器将被代码的不同部分适当地使用)。
代码在 MSVC 上失败,因为析构函数名称未知。
解决方案
推荐阅读
- bash - 如何在 GNU bash 中使用函数进行算术运算?
- r - 如果第二个字段中的值大于或等于数字(在 R 中),则修改字段中的字符串
- agora.io - 如何使用 Agora Video SDK for Unity 发送纹理
- c++ - C++ 概念能否用于在 C++ 中实现混合类型 min 和 max?
- python - 将列表值与字典的键值进行比较
- loops - PSQL for 循环、连接和分组依据
- git - Jenkins 构建顺序依赖项 SCM
- css - 小圆圈在反应中显示为椭圆
- adsense - Adsense:在不同的设备上投放不同的广告尺寸
- sql - 在 SQL 的列中选择具有不相等字段的记录