1

我目前有这个宏

#define bind(OBJECT, ROLE) \
assert( sizeof(*ROLE) == 1 ); \
ROLE = reinterpret_cast<decltype(ROLE)>(OBJECT);

它导致了一些名称冲突问题,所以我想把它移到一个模板函数中,比如

template<typename T1, typename T2>
void bind(T1 obj, T2 r) {
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};

但是,我怀疑这是不可能的,但想对此进行确认?为了改变r,我必须有一个指向指针的指针?

4

2 回答 2

3

您至少需要一个参考:

template<typename T1, typename T2>
void bind(T1 obj, T2& r)
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
}

另一种选择是使用模板转换运算符。然后您可以使用以下语法调用:

ROLE = bind(OBJ);

代码或多或少是这样的:

template<typename T1> class auto_converter
{
    const T1& value;
public:
    auto_converter(const T1& v) : value(v) {}

    // template conversion operator
    template<typename T2>
    operator T2() const
    {
        assert(sizeof (*T2()) == 1);
        return reinterpret_cast<T2>(value);
    }
};

template<typename T1>
autoconverter<T1> bind(const T1& obj) { return obj; }
于 2012-07-16T20:07:14.227 回答
2

声明 r 作为参考以更改它:

template<typename T1, typename T2>
void bind(T1 obj, 
          T2 &r) //<-- here 
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};
于 2012-07-16T20:06:40.093 回答