2012-07-16 30 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); 
};