Boost:: любой и полиморфизм

Я использую boost::any хранить указатели и задавался вопросом, есть ли способ извлечь полиморфный тип данных.

Вот простой пример того, что в идеале я хотел бы сделать, но в настоящее время не работает.

struct A {};

struct B : A {};

int main() {

    boost::any a;
    a = new B();
    boost::any_cast< A* >(a);
}

Это терпит неудачу, потому что a хранит B*, и я пытаюсь извлечь A*. Есть ли способ сделать это?

Благодарю.

3 ответа

Решение

Другой способ - хранить A* в boost::any а потом dynamic_cast выход. Что-то вроде:

int main() {
    boost::any a = (A*)new A;
    boost::any b = (A*)new B;
    A *anObj = boost::any_cast<A*>(a);
    B *anotherObj = dynamic_cast<B*>(anObj); // <- this is NULL

    anObj = boost::any_cast<A*>(b);
    anotherObj = dynamic_cast<B*>(anObj); // <- this one works!

    return 0;
}

Boost.DynamicAny - это vairant для Boost.Any, который обеспечивает более гибкое динамическое приведение базового типа. Принимая во внимание, что получение значения из Boost.Any требует, чтобы вы знали точный тип, сохраненный в Any, Boost.DynamicAny позволяет вам динамически приводить к базовому или производному классу удерживаемого типа.

https://github.com/bytemaster/Boost.DynamicAny

К сожалению, я думаю, что единственный способ сделать это это:

static_cast<A*>(boost::any_cast<B*>(a))
Другие вопросы по тегам