Hid*_*eld 4 c++ stdvector unions
我有一个工会,定义如下:
union CellType {
std::string str;
int i;
double d;
Money<2> m; // Custom class for fixed-decimal math.
};
Run Code Online (Sandbox Code Playgroud)
然后,我就有了这样的联合的向量。
std::vector<CellType> csvLine;
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何将值附加到向量的末尾?我通常使用字符串、整数等的push_backfor vector,但是当向量元素是并集时无法完全弄清楚语法。任何帮助,将不胜感激。
(是的,这个类一次读取一行 CSV 文件,如果这有什么区别的话。)
这是失败的 MRE
#include <vector>
#include <iostream>
union CellType {
std::string str;
int i;
double d;
// Money<2> m; // Custom class for fixed-decimal math.
};
int main() {
std::vector<CellType> csvLine;
CellType c;
c.str = "foo";
csvLine.push_back(c);
}
Run Code Online (Sandbox Code Playgroud)
Money 被注释掉是因为与 MRE 无关
错误
严重性代码说明项目文件行抑制状态错误 C2280 'CellType::CellType(void)':尝试引用已删除的函数 ConsoleApplication1 C:\work\ConsoleApplication1\ConsoleApplication1.cpp 22
没有干净的方法可以做到这一点,原因很简单,给定一个任意实例,union对于通用的、基于模板的函数/方法来说,没有权威的方法,比如std::vector::push_back知道联合体的哪个成员是活动的,以便执行当联合体中至少有一个成员不是 POD 时,执行特定于成员的复制/移动操作。联合体的任何特定实例都没有固有的内容表明“此特定联合体包含一个std::string因此要复制/移动它,您将使用std::string适当的复制/移动运算符”。C++ 根本不以这种方式工作,这是 C++ 的基础。没有解决方法,也没有语法。
一般来说,由于 C++ 的类型安全基础,本质上类型不安全的union与非 POD 成员(如 )一起使用时std::string,会产生功能相当有限的最终结果。
对您来说最不痛苦的是将您替换union为 C++17 的std::variant类型安全联合。push_back然后就变成了一个又大又胖、什么都没有的汉堡。
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |