Dire que j'ai envie de jeter A*
de char*
, et vice-versa, nous avons deux choix (je veux dire, beaucoup d'entre nous pense que nous avons deux choix, car les deux ne fonctionne! D'où la confusion!):
struct A
{
int age;
char name[128];
};
A a;
char *buffer = static_cast<char*>(static_cast<void*>(&a)); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
Les deux fonctionnent très bien.
//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
Même cela fonctionne très bien!
Alors, pourquoi ne nous ont reinterpret_cast
en C++ quand deux enchaînés static_cast
peut faire son travail?
Certains d'entre vous pense que ce sujet est un doublon de la précédente sujets tels que répertoriés au bas de ce post, mais il ne l'est pas. Ces sujets de discuter seulement en théorie, mais aucun d'entre eux donne un seul exemple qui démontre pourquoi reintepret_cast
ce qui est vraiment nécessaire, et deux static_cast
serait sûrement échouer. Je suis d'accord, un static_cast serait un échec. Mais comment environ deux?
Si la syntaxe de deux enchaînés static_cast
semble lourd, alors on peut écrire une fonction de modèle pour le rendre plus programmeur de l'environnement:
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
Et puis on peut l'utiliser, comme:
char *buffer = any_cast<char*>(&a); //choice 1
char *buffer = reinterpret_cast<char*>(&a); //choice 2
//convert back
A *pA = any_cast<A*>(buffer); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
Voir également cette situation, où l' any_cast
peut être utile: Bon casting pour fstream de lire et d'écrire des fonctions de membre du.
Donc ma question est fondamentalement,
- Pourquoi avons-nous
reinterpret_cast
en C++? - Montrez-moi un seul exemple où les deux enchaînés
static_cast
serait certainement pas de faire le même travail?