есть ли способы восстановить тип упакованного в boost::any объекта? Если сейчас, могу ли я сохранить для него какую-то карту ассоциаций? Мне нужно что-то вроде (псевдокод):
map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");
есть ли способы восстановить тип упакованного в boost::any объекта? Если сейчас, могу ли я сохранить для него какую-то карту ассоциаций? Мне нужно что-то вроде (псевдокод):
map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");
Не случайно, вам нужно иметь некоторые статические типы, с которыми вы хотите работать в 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
или полиморфные классы.
any
уже имеет информацию о типе, вам просто нужно явно воздействовать на нее.
- person Georg Fritzsche; 20.06.2010
Вы пытаетесь получить тип значения или просто возвращаете его к тому, что было? Если вы просто хотите разыграть его, просто используйте boost::any_cast
:
boost::any val = someMap["Key"];
RealType* r = boost::any_cast<RealType>(&val);
Допустим, у вас была такая функция для извлечения правильно типизированного извлечения из 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++.