2017-07-27 47 views
0

我想要寫簡單的C++包裝(用於RAII目的)圍繞以下C API的數組:重釋播送對象

typedef void* T; 

T createT(Arg arg); 
int foo(T t); 
closeT(T t); 
int bar(const T* ptrToArrayOfT, unsigned long size); 

對於前三種功能很簡單(對於shortiness我省略檢查錯誤和引發異常):

class C { 
public: 
    C(Arg arg) : t_(createT(arg)) {} 
    ~C() { closeT(t_); } 
    int doFoo() { return foo(t_); } 
private: 
    T t_; 
} 

至於bar我想有功能具有以下簽名:

int doBar(const vector<C>& vec); 

這裏是我正在考慮實現它:

int doBar(const vector<C>& vec) { 
    static_assert(sizeof(C) == sizeof(T)); 
    return bar(reinterpret_cast<const T*>(vec.data()), vec.size()); 
} 

它是安全的方式呢? (我懷疑是因爲C有私人會員)。如果不是,那麼有沒有什麼辦法可以實現bar()而不會給出t_C的成員? (使用矢量不是必需的)。

+0

的靜態斷言是沒有意義的,因爲'T'被定義爲'無效*'。 –

+0

@BartekBanachewicz,我沒有斷言「T」指向什麼大小。我斷言'C'與'void *'完全相同。 –

+0

'bar'功能的用途是什麼? – Holt

回答

0

不,這段代碼不安全,違反了strict aliasing

你可以隨便寫這一點,例如,沒有給人以t_訪問:

int doBar(const vector<C>& vec) { 
    std::vector<const T> ts(); 
    ts.reserve(vec.size()); 
    for (auto c : vec) { 
    ts.emplace_back(c.t_); 
    } 
    return bar(ts.data(), ts.size()); 
}