假设我想投到A*
,char*
反之亦然,我们有两个选择(我的意思是,我们中的许多人认为我们有两个选择,因为两者似乎都有效!因此混乱!):
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
两者都工作正常。
//convert back
A *pA = static_cast<A*>(static_cast<void*>(buffer)); //choice 1
A *pA = reinterpret_cast<A*>(buffer); //choice 2
即使这样也能正常工作!
那么为什么我们reinterpret_cast
在 C++ 中有两个链式 static_cast
可以完成它的工作呢?
你们中的一些人可能会认为这个主题与之前的主题重复,例如本文底部列出的主题,但事实并非如此。这些主题仅在理论上进行讨论,但没有一个给出一个例子来说明为什么reintepret_cast
真的需要,而且两个 static_cast
肯定会失败。我同意,一个 static_cast 会失败。但是两个呢?
如果两个链式的语法static_cast
看起来很繁琐,那么我们可以编写一个函数模板,使其对程序员更友好:
template<class To, class From>
To any_cast(From v)
{
return static_cast<To>(static_cast<void*>(v));
}
然后我们可以使用它,如:
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
另外,请参阅这种any_cast
可能有用的情况:Proper cast for fstream read and write member functions。
所以我的问题基本上是,
- 为什么我们有
reinterpret_cast
C++? - 请给我看一个例子,两个链式
static_cast
肯定不能做同样的工作?