Неясное поведение std::any_cast

96
29 ноября 2020, 17:40

Имеется следующий код:

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 ?

Answer 1

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);
READ ALSO
Сортировка пузырём

Сортировка пузырём

Необходимо сформировать из части элементов двумерного массива одномерный и отсортировать по убыванию

135
Факториал зависит от порядка условий

Факториал зависит от порядка условий

Почему следующая программа компилируется

206
base operand of ‘-&gt;’ is not a pointer

base operand of ‘->’ is not a pointer

Главное в этой функции всё нормально компилируется

109
Помогите решить задачу на С++

Помогите решить задачу на С++

Дана последовательность из n словДля каждого элемента определить, сколько раз это слово встречалось в этой последовательности раньше ( на позициях...

105