Восстановление любого типа - PullRequest
0 голосов
/ 20 июня 2010

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

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

Ответы [ 3 ]

0 голосов
/ 20 июня 2010

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

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

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

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

0 голосов
/ 20 июня 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 ++.

0 голосов
/ 20 июня 2010

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

boost::any val = someMap["Key"];
RealType* r = boost::any_cast<RealType>(&val);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...