C++ 联合结构体的调用函数

Bin*_*Boo 1 c++ virtual struct unions

我有嵌套结构,其中基类有一个纯虚函数。

(下面的例子有点伪,但描述了目的)

struct Base {
    int id=0;
    virtual std::wstring toString() = 0;
}
    
struct Top1 : public Base {
    id=1;
    int val = 5;
    std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}
    
struct Top2 : public Base {
    id=2;
    std::string val = "Hello!";
    std::wstring toString() { return L"need to use string stream. id="+id+" val="+val; }
}
Run Code Online (Sandbox Code Playgroud)

我希望为所有不同类型创建一个表,所以我创建了这个:

struct BaseFootprint{
    union{
        Top1 top1;
        Top2 top2;
    }
    
    std::vector<BaseFootprint> data;
Run Code Online (Sandbox Code Playgroud)

通过以下方式调用该函数不起作用:

for(int i=0;i<data.size;i++){
    std::cwout <<data[i].toString()<< std::endl;;
}
Run Code Online (Sandbox Code Playgroud)

我努力了:

std::cwout << ((base)data[i]).toString() << std::endl;
Run Code Online (Sandbox Code Playgroud)

和:

std::cwout << (Top1)data[i].toString() << std::endl;
Run Code Online (Sandbox Code Playgroud)

但它总是说data[i]-> empty

因此,令我失望的是,纯虚函数没有指向正确的顶层函数,这并不意外,这取决于如何通过联合查看结构数据。

由于我的最终产品将容纳数百种不同的顶级类型,我希望有一个动态的解决方案,而不是做出硬写的选择。动态解决方案将允许我在不更改基本代码的情况下添加新类型,这就是我所希望的。

如果有一种方法可以实现所描述的这一点,那就太棒了。

Yks*_*nen 5

联盟不是正确的工具。
忽略其他编译器错误,您需要访问联合的特定成员(例如data[i].top1),并且无法访问除最后写入的成员之外的任何成员(这意味着您需要以某种方式记住向量中的哪个成员)。std::variant是类型安全的union,但您仍然需要大量样板代码才能访问正确的成员。

在 C++ 中使用多态性的正常方法是通过指针:

int main()
{
    std::vector<std::unique_ptr<Base>> data;
    data.push_back(std::make_unique<Top1>());
    data.push_back(std::make_unique<Top2>());
    for (auto& ptr : data)
    {
        std::wcout << ptr->toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • _“大量样板代码”_是单个访问者。由于两个成员具有相同的名称,因此它很容易看起来像 `std::visit([](auto&amp;&amp; arg){ std::cwout &lt;&lt; arg.toString() &lt;&lt; std::endl;}, element);` (2认同)