如何将 std::array<char, N> 转换为 char (&dest)[N]?
how convert std::array<char, N> to char (&dest)[N]?
传std::array<char, N>
的方法是什么
这样的功能:
template<size_t N>
void safe_func(char (&dest)[N]);
?
我试试这个:
#include <array>
template <size_t N> using SafeArray = char[N];
template <size_t N> void safe_func(char (&dest)[N]) {}
int main() {
SafeArray<10> a1;
safe_func(a1);
std::array<char, 10> a2;
safe_func(*static_cast<SafeArray<10> *>(static_cast<void *>(a2.data())));
}
它有效,但我怀疑,可能是我的演员有问题,
在其他编译器或平台上(我使用 gcc/linux/amd64),
我遇到了错误的参考资料?
一种方式:
template<class T, size_t N>
using c_array = T[N];
template<class T, size_t N>
c_array<T, N>& as_c_array(std::array<T, N>& a) {
return reinterpret_cast<T(&)[N]>(*a.data());
}
int main() {
std::array<int, 2> a;
int(&b)[2] = as_c_array(a);
}
标准要求 std::array
是一个 aggregate,它的唯一成员是 T[N]
,一个指向 std::array::data()
returns 的指针。由于聚合的地址与其第一个成员的地址一致,调用和取消引用 std::array::data()
并不是绝对必要的,reinterpret_cast<T(&)[N]>(a)
也可以。
std::array
起源于 boost,其唯一目的是为内置数组 T[N]
提供标准容器接口 (begin/end/size/empty/etc.
),仅此而已,这样它就没有任何开销,0 成本的抽象。因此,您基本上可以来回转换 boost::array<T, N>
和 T[N]
,尽管这样做可能会违反别名规则(编译器假定 boost::array<T, N>
和 T[N]
指的是不同的对象,所以你需要知道在你的具体情况下如何应对。
该标准放弃了所有基本原理,并以非常软弱和模糊的术语表达了 std::array
的要求。所以人们想知道它是否真的只有 T[N]
成员在那里,而不是一些据称满足要求的外星类型。
传std::array<char, N>
的方法是什么
这样的功能:
template<size_t N>
void safe_func(char (&dest)[N]);
?
我试试这个:
#include <array>
template <size_t N> using SafeArray = char[N];
template <size_t N> void safe_func(char (&dest)[N]) {}
int main() {
SafeArray<10> a1;
safe_func(a1);
std::array<char, 10> a2;
safe_func(*static_cast<SafeArray<10> *>(static_cast<void *>(a2.data())));
}
它有效,但我怀疑,可能是我的演员有问题, 在其他编译器或平台上(我使用 gcc/linux/amd64), 我遇到了错误的参考资料?
一种方式:
template<class T, size_t N>
using c_array = T[N];
template<class T, size_t N>
c_array<T, N>& as_c_array(std::array<T, N>& a) {
return reinterpret_cast<T(&)[N]>(*a.data());
}
int main() {
std::array<int, 2> a;
int(&b)[2] = as_c_array(a);
}
标准要求 std::array
是一个 aggregate,它的唯一成员是 T[N]
,一个指向 std::array::data()
returns 的指针。由于聚合的地址与其第一个成员的地址一致,调用和取消引用 std::array::data()
并不是绝对必要的,reinterpret_cast<T(&)[N]>(a)
也可以。
std::array
起源于 boost,其唯一目的是为内置数组 T[N]
提供标准容器接口 (begin/end/size/empty/etc.
),仅此而已,这样它就没有任何开销,0 成本的抽象。因此,您基本上可以来回转换 boost::array<T, N>
和 T[N]
,尽管这样做可能会违反别名规则(编译器假定 boost::array<T, N>
和 T[N]
指的是不同的对象,所以你需要知道在你的具体情况下如何应对。
该标准放弃了所有基本原理,并以非常软弱和模糊的术语表达了 std::array
的要求。所以人们想知道它是否真的只有 T[N]
成员在那里,而不是一些据称满足要求的外星类型。