我想围绕以下C API编写简单的C ++包装(用于RAII目的):
typedef void* T;
T createT(Arg arg);
int foo(T t);
closeT(T t);
int bar(const T* ptrToArrayOfT, unsigned long size);
对于前三个函数,它很简单(为了简短,我省略了检查错误和抛出异常):
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 :(得分: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());
}