Есть ли способ получить целое число из boost :: any, если вы не знаете, был ли оригинальный тип подписан или не подписан - PullRequest
2 голосов
/ 08 октября 2011

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

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

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

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

1 Ответ

2 голосов
/ 08 октября 2011

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

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

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

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

...