boost :: any со структурами и беззнаковыми целочисленными значениями - PullRequest
0 голосов
/ 28 июня 2018

На мой вопрос есть несколько частей. Я изучал, как / когда использовать boost::any. Мне было интересно, можно ли присвоить struct переменной boost::any.

Пример:

struct S {
   int x;
};

S s;
s.x = 5;

boost::any var = s;

Мне кажется, это возможно, но это подводит меня к следующему вопросу. Если это правильное назначение, то как мне получить доступ к элементу данных x? var не является struct типом, поскольку boost::any.

Мой следующий вопрос не зависит от того, доступен ли элемент данных или нет. Тогда возникает вопрос: а что, если переменная a имеет тип uint8_t?

Пример: Редактировать: как указано в комментариях, приведенный ниже код поддерживает uint8_t, но он не печатается. См. uint8_t не может быть напечатан cout .

uint8_t a = 10;

boost::any b = a;

std::cout << boost::any_cast<uint8_t>(b);

Я обнаружил, что можно использовать boost::any_cast, но не обнаружил, что он поддерживает неподписанные типы. Когда я попытался использовать boost::any_cast<uint8_t>(), он не печатал, но не выдавал ошибку. Можно ли получить значение типа, например uint8_t, используя boost? Если так, то как?

Я буду продолжать читать больше документации по boost :: any , но если у кого-то есть понимание, подробности или примечания по этим вопросам или предмету, пожалуйста, напишите, как я хотел бы узнать больше о том, как это работает , Спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Мне было интересно, можно ли присвоить структуру переменной boost::any

Это так.

Как мне получить доступ к элементу данных x?

Вы получите доступ с помощью any_cast<S>(var).x. Продолжая ваш пример:

int& the_x_member = any_cast<S>(var).x;
std::cout << "s.x is " << the_x_member << "\n";

Что если переменная a имеет тип uint8_t?

Совершенно возможно назначить целочисленный тип без знака для boost::any (или std::any, который делает то же самое, но с несколько другим синтаксисом).

Когда я пытался использовать boost::any_cast<uint8_t>(), он не печатал, но не выдавал ошибку.

Разве это не "печатает" \0 символ? Так что, похоже, ничего не было напечатано.

Можно ли получить значение типа, подобного uint8_t, используя Boost? Если да, то как?

Как и следовало ожидать:

uint8_t u = 234;
boost::any ba = u;
std::cout << "u is " << (int) boost::any_cast<uint8_t>(ba) << '\n';

Это действительно работает .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...