重新解释指向对象数组的指针

时间:2017-07-27 13:45:47

标签: c++ reinterpret-cast

我想围绕以下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? (不需要使用矢量)。

1 个答案:

答案 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());
}