Допустим, я хочу преобразовать A *
в char *
и наоборот, у нас есть два варианта (я имею в виду, многие из нас думают, что нас двое choices, потому что оба, похоже, работают! Отсюда путаница!):
struct A
{
int age;
char name[128];
};
A a;
char *buffer = static_cast(static_cast(&a)); //choice 1
char *buffer = reinterpret_cast(&a); //choice 2
Оба работают нормально.
//convert back
A *pA = static_cast(static_cast(buffer)); //choice 1
A *pA = reinterpret_cast(buffer); //choice 2
Даже это работает нормально!
Итак, почему у нас есть reinterpret_cast
в C ++, когда два связанных static_cast
могут выполнять свою работу?
Некоторые из вас могут подумать, что эта тема дублирует предыдущие темы, такие как перечисленные в конце этого сообщения, но это не . Эти темы обсуждаются только теоретически, , но ни одна из них не дает ни единого примера, демонстрирующего , почему reintepret_cast
действительно нужен, а два static_cast
будут наверняка не получится. Согласен, один static_cast потерпит неудачу. Но как насчет двух?
Если синтаксис двухцепочечного static_cast
выглядит громоздким, тогда мы можем написать шаблон функции, чтобы сделать его более удобным для программистов:
template
To any_cast(From v)
{
return static_cast(static_cast(v));
}
И тогда мы можем использовать это, как :
char *buffer = any_cast(&a); //choice 1
char *buffer = reinterpret_cast(&a); //choice 2
//convert back
A *pA = any_cast(buffer); //choice 1
A *pA = reinterpret_cast(buffer); //choice 2
Также см. Эту ситуацию, где any_cast
может быть полезным: Правильное приведение типов для функций-членов чтения и записи fstream .
Итак, мой вопрос в основном таков:
reinterpret_cast
в C ++? static_cast
наверняка не справятся с одной и той же задачей?