我需要输入一个"令牌"输入" obj"反向" obj" to" Token"。
虽然我找到了从obj到Token的方向,但我不知道如何做反向。
typdef int16_t Token;
struct obj{
Token t;
operator Token(){return t-tokenBase;}
}
用途是:
(Token)o
并且有一个令牌和反向
(obj)t
并有一个obj
答案 0 :(得分:0)
你需要一个转换运算符来将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
}
另一种更黑客的方式是我们指针转换。这不是真正干净的代码,应该谨慎使用,当你知道自己在做什么时。
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);
}