Есть ли способ получить целое число из boost::any, если вы не знаете, был ли исходный тип подписан или неподписан?

Я использую boost::any в сочетании с boost::any_cast<> для написания кода фреймворка, который должен принимать набор аргументов, почти как вызов функции, и преобразовывать их в массив boost::any типов.

До сих пор все работало отлично, за исключением мест, где трудно предсказать, будет ли номер, который дает мне звонящий, подписанным или неподписанным. Много кода в нашем существующем продукте (основанном на Windows) использует типы данных DWORD и BYTE для локальных переменных, поэтому, если используется одна из этих переменных, я получаю беззнаковый тип. Однако, если константа жестко закодирована, скорее всего, это будет простое число, и в этом случае оно будет подписано.

Так как я не могу предсказать, должен ли я делать any_cast<int> или any_cast<unsigned int>, в 50% случаев мой код, который читает массив boost::any, не будет работать.

Кто-нибудь знает, есть ли способ получить только число из boost::any независимо от того, был ли исходный тип подписанным или беззнаковым?


person DXM    schedule 08.10.2011    source источник


Ответы (1)


Нет способа; boost::any выполняет простейшую форму стирания типов, при которой тип должен точно совпадать. Вы можете написать свой собственный boost::any-подобный класс, который поддерживает дополнительные функции, которые вы хотите. Я ранее продемонстрировал, как это можно сделать .

В противном случае вы можете:

  1. Имейте два пути кода, по одному для каждого знака. (Переключиться на подписанный путь, если any_cast<unsigned T> выдает.)
  2. Попробуйте неподписанный, и если это выдает, попробуйте подписанный и приведенный, используйте один путь кода.
  3. Просто позвольте неподписанному any_cast бросить, если он подписан, и заставьте пользователя справиться.

Тем не менее, каждый из них не так хорош. Вам действительно нужно boost::any? Возможно, вместо этого вам нужен boost::variant, если вы ожидаете определенный список типов.

person GManNickG    schedule 08.10.2011