我有一个boost::array<float, 12>
我想用作签名的函数的输入:
Foo(const float(&arr)[12])
我尝试通过.data()
从boost :: array获取数据元素,但这会返回一个不符合我签名的浮点指针。我可以改变功能签名,但不愿意。想法?
答案 0 :(得分:5)
以下代码将编译:
#include <array>
void f(int (&arr)[4])
{
}
int main()
{
std::array<int, 4> arr = {1, 2, 3, 4};
f(*reinterpret_cast<int (*)[4]>(arr.data()));
return 0;
}
诀窍是使用int*
将arr.data()
返回的int (*)[4]
转换为“指向数组的指针”(即reinterpret_cast
)。然后取消引用它以获得该数组的“引用”。
编辑:使用下面的模板可能会更好,以确保将指针强制转换为适当的数组类型。
template<class T, std::size_t N>
T (&as_simple_array(std::array<T, N>& arr))[N] {
return *reinterpret_cast<T (*)[N]>(arr.data());
}
然后你就这样使用它:
f(as_simple_array(arr));
答案 1 :(得分:3)
synopsis表示实际数组名为elems
,因此这应该有效:
Foo(my_array.elems);
目前还不清楚该成员是否有保证如此命名,或者是否仅仅是&#34;仅仅展示了#34;喜欢标准中的某些成员。无论如何,以下应该有效,但它很难看:
Foo(reinterpret_cast<const float (&)[12]>(my_array[0]));
这在C ++ 14中定义明确。引用的reinterpret_cast
具有与指针对应的reinterpret_cast
相同的语义([expr.reinterpret.cast] ] / 11),
*reinterpret_cast<const float (*)[12]>(&my_array[0])
此重新解释强制转换相当于双static_cast
([expr.reinterpret.cast] / 7):
static_cast<const float (*)[12]>(static_cast<const void*>(&my_array[0]))
保证转换为 cv void
指向对象的第一个字节([conv.ptr] / 2)。只要地址适当地对齐目标类型的对象([expr.static.cast] / 13),后续转换为const float (*)[12]
也可以保证给出指向同一字节的指针,该对象必须是因为它最初是一个数组的地址。