向前和向后的类型转换

时间:2014-06-12 18:18:33

标签: c++ struct casting

我需要输入一个"令牌"输入" obj"反向" obj" to" Token"。

虽然我找到了从obj到Token的方向,但我不知道如何做反向。

typdef int16_t Token;

struct obj{
    Token t;
    operator Token(){return t-tokenBase;}
}

用途是:

(Token)o 

并且有一个令牌和反向

(obj)t 

并有一个obj

1 个答案:

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