我正在学习C ++并阅读Andrei Alexandrescu关于泛型编程的书。他提出了一个模板化的类,可用于在类型之间进行转换:
template <class To, class From>
To safe_reinterpret_cast(From from)
{
assert(sizeof(From) <= sizeof(To));
return reinterpret_cast<To>(from);
}
这适用于:
int i = 5;
char* p = safe_reinterpret_cast<char*>(i);
但
失败std::string a("apple");
char* pp = safe_reinterpret_cast<char*>(a);
这是编译时的错误失败:
invalid cast from type 'std::basic_string<char>' to type 'char*'
为什么这个演员会失败?
答案 0 :(得分:1)
因为int
和char
是基本类型,而std::string
则不是。
答案 1 :(得分:1)
Andrei Alexandrescu的臭名昭着的例子仅适用于普通数据类型。
不指针工作。铸造不相关指针类型的行为是未定义的。
您可以仅 reinterpret_cast到void*
,并将void*
的reinterpret_cast重新设置回原始指针类型。