gpt4 book ai didi

c++ - 如何将 std::array 转换为 char (&dest)[N]?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:21 25 4
gpt4 key购买 nike

通过什么途径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())));
}

它有效,但我怀疑,可能是我的 Actor 有问题,在其他编译器或平台上(我使用 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() 的指针返回。由于聚合的地址与其第一个成员的地址一致,调用并取消引用 std::array::data()不是绝对必要的,reinterpret_cast<T(&)[N]>(a)同样有效。

std::array起源于boost ,它的唯一目的是为内置数组 begin/end/size/empty/etc. 提供标准容器接口(interface)( T[N] )没有别的,所以它没有任何开销,0 成本抽象。因此,你基本上可以投 boost::array<T, N>T[N]来回这样做可能会破坏别名规则(编译器假定 boost::array<T, N>T[N] 指的是不同的对象,因此您需要知道如何在您的特定情况下处理它)。

该标准放弃了所有理由并表达了std::array的要求用非常微弱和模糊的术语。以至于让人怀疑是不是真的只有T[N]那里的成员,而不是某些满足要求的据称外星人类型。

关于c++ - 如何将 std::array<char, N> 转换为 char (&dest)[N]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com