Имеется следующий код:
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);
Продвижение своими сайтами как стратегия роста и независимости