Имеется следующий код:
int i = 3;
std::any a = &i;
try {
int* ptr = std::any_cast<int>(&a);
if (!ptr)
ptr = std::any_cast<int*>(a);
}
catch (std::bad_cast) {
std::cout << "Bad cast catched!\n";
}
Вопрос возникает насчёт данной строки:
int* ptr = std::any_cast<int>(&a);
Если предположить, что any хранит просто int, то я пытаюсь получить указатель на хранимые данные, т.е. указатель на int, но т.к. any хранит указатель на int, то получается, что я пытаюсь получить указатель на указатель ? Каким образом возможно приведение указателя на указатель int-а к обычному указателю на int и почему возвращается nullptr ?
std::any_cast
в случае попытки выполнения неправильного преобразования старается вести себя аналогично dynamic_cast
: при передаче входного std::any
по ссылке он выбрасывает исключение, а при передаче std::any
по указателю он возвращает нулевой указатель.
Для выполнения успешного std::any_cast<T>
, во всех версиях, как в ссылочных, так и в указательных, шаблонный параметр T
должен совпадать с хранимым типом.
почему возвращается nullptr
Ваш объект std::any a
хранит значение типа int *
, а вы его пытаетесь читать через std::any_cast
как int
. int *
и int
- разные типы. Так как вы используете указательную версию std::any_cast
, несоответствие типов приводит к возвращению nullptr
. Его вы и видите.
я пытаюсь получить указатель на указатель ?
Да, совершенно верно, указательная версия std::any_cast
предназначена именно для получения прямого указателя на хранимые данные. Так как ваш a
хранит int *
, то указательная версия std::any_cast
предназначена для получения именно указателя на указатель int **
. Правильный синтаксис
int **pptr = std::any_cast<int *>(&a);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Необходимо сформировать из части элементов двумерного массива одномерный и отсортировать по убыванию
Дана последовательность из n словДля каждого элемента определить, сколько раз это слово встречалось в этой последовательности раньше ( на позициях...