2012-07-16 29 views
1

我现在有把指针这个宏C++在功能

#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,我必须有一个指针指针?

回答

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; } 
+0

模板变换操作?会是什么样子? – 2012-07-16 20:12:26

+1

@迈克尔:花了一些时间把它全部输入,但在这里。 – 2012-07-16 20:12:46

2

申报R作为参考,以改变它:

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