Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Max FraiОтветов: 3

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

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

c++typesstore

Ответы

Ответ 1 · Georg Fritzsche

Не случайно, вам нужно иметь некоторые статические типы, с которыми вы хотите работать в 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 или полиморфные классы.

Ответ 2 · Louis Marascio

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

boost::any val = someMap["Key"];
RealType* r = boost::any_cast<RealType>(&val);

Ответ 3 · Clark Gaebel

Допустим, у вас была такая функция для извлечения правильно типизированного извлечения из 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++.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы