例として、実部/虚部を別々にストリーム入出力させたいときとか。
それ 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]; // ストリーム入力に使ったり } }
根拠は 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] の虚部を示す。