I must pass complex data to a C function from C++. In C++ the data is naturally stored in a
std::vector<std::complex开发者_开发知识库> c
. The C function expects the data as an array of double, double a[]
such that a[0]=Re(c[0]), a[1]=Im(c[0]), a[2]=Re(c[1]), etc.
What is the best safe way to pass such data? Is casting like
(double*) (&c[0])
asking for trouble?
Sorry if this is duplicate, I could only find information on the related problem of passing C++ complex to C99 complex.
The C++0x standard went to lengths to guarantee that such conversions will work (§26.4):
Moreover, if a is an expression of type
cv std::complex<T>*
and the expressiona[i]
is well-defined for an integer expressioni
, then:—
reinterpret_cast<cv T*>(a)[2*i]
shall designate the real part ofa[i]
, and—
reinterpret_cast<cv T*>(a)[2*i + 1]
shall designate the imaginary part ofa[i]
.
and (§23.3.6):
The elements of a vector are stored contiguously, meaning that if
v
is avector<T, Allocator>
whereT
is some type other than bool, then it obeys the identity&v[n] == &v[0] + n
for all0 <= n < v.size()
.
The layout of the complex value is not guaranteed by the prevailing C++03 standard (though the vector layout is), but I would be surprised to find an implementation for which it does not hold.
精彩评论