附加到联合向量

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

Sam*_*hik 5

没有干净的方法可以做到这一点,原因很简单,给定一个任意实例,union对于通用的、基于模板的函数/方法来说,没有权威的方法,比如std::vector::push_back知道联合体的哪个成员是活动的,以便执行当联合体中至少有一个成员不是 POD 时,执行特定于成员的复制/移动操作。联合体的任何特定实例都没有固有的内容表明“此特定联合体包含一个std::string因此要复制/移动它,您将使用std::string适当的复制/移动运算符”。C++ 根本不以这种方式工作,这是 C++ 的基础。没有解决方法,也没有语法。

一般来说,由于 C++ 的类型安全基础,本质上类型不安全的union与非 POD 成员(如 )一起使用时std::string,会产生功能相当有限的最终结果。

对您来说最不痛苦的是将您替换union为 C++17 的std::variant类型安全联合。push_back然后就变成了一个又大又胖、什么都没有的汉堡。