Восстановление любого типа

есть ли способы восстановить тип упакованного в boost::any объекта? Если сейчас, могу ли я сохранить для него какую-то карту ассоциаций? Мне нужно что-то вроде (псевдокод):

map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");

person Max Frai    schedule 20.06.2010    source источник


Ответы (3)


Не случайно, вам нужно иметь некоторые статические типы, с которыми вы хотите работать в C++.

Таким образом, вы можете проверить или привести к определенному типу, используя any::type() и any_cast(), например:

const boost::any& any = someMap["Key"].type();
if (int* i = boost::any_cast<int>(&any)) {
    std::cout << *i << std::endl;
} else if (double* d = boost::any_cast<double>(&any)) {
// ...

Но что-то вроде следующего не может быть сделано вообще из-за статической типизации С++:

magically_restore_type(someMap["Key"]).someMethod();

Использование чего-то вроде boost::any в C++ почти всегда не очень хорошая идея, именно потому, что обработка произвольных типов не доставляет удовольствия. Если вам нужно обрабатывать только известный конечный набор типов, не используйте boost::any — есть лучшие варианты, такие как boost::variant или полиморфные классы.

person Georg Fritzsche    schedule 20.06.2010
comment
А как насчет другой карты с ассоциацией? Нравится Ключ -> Тип, Ключ -> Значение. - person Max Frai; 20.06.2010
comment
@Ockonal: проблема остается прежней, вы должны явно обрабатывать различные типы, которые могут быть сохранены - в C++ нет утиного ввода во время выполнения. any уже имеет информацию о типе, вам просто нужно явно воздействовать на нее. - person Georg Fritzsche; 20.06.2010

Вы пытаетесь получить тип значения или просто возвращаете его к тому, что было? Если вы просто хотите разыграть его, просто используйте boost::any_cast:

boost::any val = someMap["Key"];
RealType* r = boost::any_cast<RealType>(&val);
person Louis Marascio    schedule 20.06.2010
comment
Я не знаю такого настоящего типа. В любой карте хранятся разные данные. Я должен восстановить каждый тип. - person Max Frai; 20.06.2010
comment
Вам нужно либо (а) знать, какой тип вы хотите восстановить; (б) иметь способ определить тип, который вы хотите восстановить; или (c) угадайте, какой тип вы хотите восстановить, попробовав каждый из возможных вариантов. Все ли возможные типы происходят от общего базового класса? - person Louis Marascio; 20.06.2010

Допустим, у вас была такая функция для извлечения правильно типизированного извлечения из boost::any. Каким будет возвращаемое значение этой функции? Как бы выглядел ваш код?

// Extracts v and returns the correct type... except we can't do that in C++. Let's just call it MagicalValue for now.
MagicalValue magic(const boost::any& v);

void perform_magic(const boost::any& v)
{
    MagicalValue r = magic(v);
    r.hello_world();    // Wait, what?
}

Вы не можете проделывать подобные трюки в языках со статической типизацией. Что вы можете попробовать, так это полиморфизм вместо boost::any. Это дает вам общий интерфейс, который вы МОЖЕТЕ использовать в C++.

person Clark Gaebel    schedule 20.06.2010