向前和向后进行类型转换
typecasting forward and backward
本文关键字:类型转换 更新时间:2023-10-16
我需要将"Token"类型强制转换为"obj",反过来将"obj"类型强制转换为"Token"。
虽然我已经找到了从obj到Token的方向,但我不知道如何做相反的。
typdef int16_t Token;
struct obj{
Token t;
operator Token(){return t-tokenBase;}
}
用法是:
(Token)o
有Token,反之
(obj)t
和一个obj
您需要一个转换操作符来将obj转换为Token,但是对于另一种方式,您需要一个特殊的构造函数。试试这段代码,你可能会更清楚。
typedef int16_t Token;
struct obj{
Token t;
obj(Token tt):t(tt){
std::cout << "special constructor called" << std::endl;
}
operator Token(){
std::cout << "conversion operator called" << std::endl;
return t;
}
void print(){
std::cout << t << std::endl;
}
};
int main(int argc, const char * argv[])
{
obj test(13);
std::cout<< (Token) test<<std::endl; // uses conversion operator
Token t = 244;
((obj)t).print(); // uses constructor
}
另一种更hack的方法是使用指针转换。这不是真正干净的代码,应该小心使用,当你知道你在做什么。
typedef int16_t Token;
struct obj{
Token t;
void print(){
std::cout << t << std::endl;
}
};
int main(int argc, const char * argv[])
{
obj test;
std::cout<< *((Token*) &test)<<std::endl;
Token t = 244;
(*((obj*) &t)).print();
}
这种丑陋的行为可以写成这样的泛化函数:
template<typename Type1, typename Type2>
Type2& convert2(Type1& a){
return *((Type2*) &a);
}
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换