У меня есть некоторый код, в котором каждый элемент в boost :: варианте выполняет общий интерфейс. По разным причинам я не хочу хранить их как стертые типы. Есть ли простой способ получить доступ к интерфейсу, учитывая вариант, без написания посетителя для каждого возможного случая? Все конкретные ошибки, которые я получаю с помощью нижеприведенного, находятся на линии приведения и следующие:
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;
}