【发布时间】:2018-02-16 15:14:25
【问题描述】:
我想编写一个带有提供读取功能的接口的库。 C 风格的数组容易出错,但允许传递任意大小的缓冲区。 C++ 数组更安全,但必须使用大小构造。
// interface.h
// C-style array
int read (std::uint8_t* buf, size_t len);
// C++ array
int read (std::array<std::uint8_t, 16>& buff)
我怎样才能两全其美?
我在考虑函数模板,但它似乎不适用于库接口。
template <size_t N>
int read (std::array<std::uint8_t, N>& buf);
编辑
std::vector 可能是一个不错的候选,但如果我们认为 char* 和 std::array 没有动态分配。
编辑我非常喜欢gsl::span 的解决方案。我坚持使用 C++14,所以没有std::span。我不知道使用第三个库 (gsl) 是否会成为问题/允许。
编辑我不认为在另一种类型上使用char 会对答案产生一些影响,所以更清楚的是操纵字节。我把char改成std::uint8_t
编辑由于 C++11 保证返回 std::vector 将被移动而不是复制,因此返回 std::vector<std::uint8_t> 是可以接受的。
std::vector<std::uint8_t> read();
【问题讨论】:
-
使用
std::vector? -
如果
N是一个编译时间常数,并且您不关心发布read的实现,并且您不需要您的API 与C 兼容,那么就没有任何意义模板版本有问题。 -
gsl::span怎么样? -
很难说你在做什么,但你可能会考虑基于迭代器的接口,不需要特定的容器。
-
std::vector具有动态分配,但char*或std::array没有。