std::complex の実部/虚部への参照を取得する

例として、実部/虚部を別々にストリーム入出力させたいときとか。
それ reinterpret_cast で出来るよ!

#include <complex>
#include <cassert>
#include <sstream>
 
int main()
{
  std::complex<double> z( 1, 1 );
  double (&a)[2] = reinterpret_cast<double (&)[2]>(z); // well-formed
 
  assert( z.real() == a[0] );
  assert( z.imag() == a[1] );
 
  a[0] += 1; // 例えば += したり
  {
    std::istringstream iss("3.14");
    iss >> a[1]; // ストリーム入力に使ったり
  }
}

http://ideone.com/erQOy


根拠は N3092 の 26.4 Complex numbers 4 です。以下 適当訳:

もし z が cv std::complex<T> 型の lvalue expression ならば、
 式 reinterpret_cast<cv T(&)[2]>(z) は well-formed であり(shall be well-formed)、
 reinterpret_cast<cv T(&)[2]>(z)[0] は z の実部を示し、
 reinterpret_cast<cv T(&)[2]>(z)[1] は z の虚部を示す。
加えて、 a が cv std::complex<T>* 型の式であり、 a[i] が整数式 i に対して
well-defined であるならば、
 reinterpret_cast<cv T*>(a)[2*i]   は a[i] の実部を示し、
 reinterpret_cast<cv T*>(a)[2*i+1] は a[i] の虚部を示す。