我的多形体是如何符合标准的?

时间:2017-01-30 19:22:53

标签: c++ c++11 casting type-conversion c++17

通常在我编写的代码中,有些类型是布局兼容的但是类型不同,但我仍然希望将它们传递给它们,就好像它们是相同的类型一样。这带来了相当多的语法开销,包括必要的强制转换等。

我(非常)最近想到了一个小助手混合课程,我称之为polymorph

struct polymorph
{
  template<typename T>
  const T& as() const { return reinterpret_cast<const T&>(*this); }
  template<typename T>
  T& as() { return reinterpret_cast<T&>(*this); }
}

一个小例子&#34;展示&#34;它对于经典的#34;我的复数类型比你的更好&#34;情况here *。 我的问题是:这个类有多强大,我怎样才能使它更能抵御滥用和/或未定义的行为。我没有经常使用它而且有点犹豫,因为有很多事情可能会非常错误。

此课程主要用于_Complex / std::complex<double> / double[2]之间的通信。我还在考虑一种很好的方法来扩展它以执行有用的转换,以及确切的有用性。

*注意我并不是说这完全是未定义的 - 没有行为。因此这个问题。

1 个答案:

答案 0 :(得分:3)

您违反了[basic.lval] / 8,通常称为&#34;严格别名规则&#34;。它表示您可能无法通过与指向的对象不同类型的指针访问对象,但有许多例外(指向基类的指针,unsigned char*const / {{1}差异等)。布局兼容性不是这种考虑的一部分。

是的,这是UB。