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 позволяет вам динамически приводить к базовому или производному классу удерживаемого типа.
К сожалению, я думаю, что единственный способ сделать это это:
static_cast<A*>(boost::any_cast<B*>(a))