gpt4 book ai didi

c++ - 如果所有选项都满足一个接口(interface),是否可以使用 boost 变体进行类型删除?

转载 作者:行者123 更新时间:2023-11-30 03:22:21 24 4
gpt4 key购买 nike

我有一些代码,其中 boost::variant 中的每个元素都实现了一个通用接口(interface)。由于各种原因,我不想将它们存储为已删除类型。有没有一种简单的方法可以在给定变体的情况下进入界面,而无需为每种可能的情况编写访问者?我在下面得到的具体错误都在投行上,如下所示:

error C2100: illegal indirection
error C2440: 'static_cast': cannot convert from 'animal *' to 'iAnimal *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
error C2227: left of '->speak' must point to class/struct/union/generic type

#include <iostream>
#include "Boost/variant.hpp"

class iAnimal
{
public:
virtual std::string speak() = 0;
virtual ~iAnimal() {};
};

struct cat : public iAnimal
{
std::string speak()
{
return "Meow!";
}
};

struct dog : public iAnimal
{
std::string speak()
{
return "Woof!";
}
};

int main()
{
typedef boost::variant<cat, dog> animal;
animal fluffy = cat();
std::cout << static_cast<iAnimal*>(&*fluffy)->speak() << std::endl;
return 0;
}

最佳答案

你可以使用类似的东西:

boost::variant<cat, dog> animal;
animal fluffy = cat();
boost::apply_visitor([](auto& e) -> iAnimal& { return e; }, fluffy).speak();

在 C++17 中,对于 std,它将是

std::variant<cat, dog> animal;
animal fluffy = cat();
std::visit([](auto& e) -> iAnimal& { return e; }, fluffy).speak();

关于c++ - 如果所有选项都满足一个接口(interface),是否可以使用 boost 变体进行类型删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51197824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com