向前和向后进行类型转换

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);
}