对于带参数的函数,使用boost :: array <float,12 =“”>(const float(&amp; arr)[12])</float,>

时间:2015-01-02 22:15:28

标签: c++ arrays boost casting

我有一个boost::array<float, 12>我想用作签名的函数的输入:

Foo(const float(&arr)[12])

我尝试通过.data()从boost :: array获取数据元素,但这会返回一个不符合我签名的浮点指针。我可以改变功能签名,但不愿意。想法?

2 个答案:

答案 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]也可以保证给出指向同一字节的指针,该对象必须是因为它最初是一个数组的地址。