我发现了很多设计问题,特别是传递std::array<>给函数时。基本上,当您初始化 std::array 时,它会接受两个模板参数<class T和size_t size>。但是,当您创建需要 和 的函数时std::array,我们不知道大小,因此我们还需要为函数创建模板参数。
template <size_t params_size> auto func(std::array<int, params_size> arr);
Run Code Online (Sandbox Code Playgroud)
为什么不能std::array在构造函数中获取大小?(IE):
auto array = std::array<int>(10);
Run Code Online (Sandbox Code Playgroud)
那么这些函数看起来就不那么激进了,并且不需要模板参数,如下所示:
auto func (std::array<int> arr);
Run Code Online (Sandbox Code Playgroud)
我只是想知道 的设计选择std::array,以及为什么这样设计。
这不是一个由于错误而产生的问题,而是一个为什么std::array<>要以这种方式设计的问题。
我有一个类型声明为:
using Buffer = std::unique_ptr<std::array<uint8_t, N>>;
Run Code Online (Sandbox Code Playgroud)
我还有一个模板函数声明为:
template<typename Buffer>
bool temp_func()
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Buffer 类型调用 temp_func:
temp_func<Buffer>();
Run Code Online (Sandbox Code Playgroud)
现在,在 temp_func 中,我想获取该类型的大小Buffer,而不创建该类型的实例。
我需要的是类似于std::tuple_size<Buffer>::value除了我不能调用std::tuple_size,unique_ptr只能直接调用std::array。
我只能使用 C++11。我该怎么做?
std::array<uint8_t,N>我正在尝试从 a创建 a,std::span<uint8_t,N>但我找不到一种没有memcpy、或 的方法来执行此操作std::copy,或者std::ranges::copy这不能保护我免受目标数组大小的错误指定。
#include <algorithm>
#include <array>
#include <iostream>
#include <span>
int main(int argc, char **argv) {
constexpr size_t N = 10;
std::array<uint8_t, N> original;
std::span span(original); // of type std::span<uint8,N>
std::array copy1(span); // does not work
std::array<uint8_t, N> copy2(span); // does not work
std::array<uint8_t, N> copy3(begin(span), end(span)); // does not work
// ugly stuff that works, but does not protect me if I specify wrong array size
constexpr size_t …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,我有这个来自 C 的结构。这段代码非常旧,无法修改:
struct Point {
double coord[3];
};
Run Code Online (Sandbox Code Playgroud)
另一方面,我有这个现代函数,它返回现代std::array而不是原始数组:
std::array<double, 3> ComputePoint();
Run Code Online (Sandbox Code Playgroud)
目前,为了Point从返回值初始化 a,我手动从 中提取每个元素std::array:
std::array<double, 3> ansArray{ComputePoint()};
Point ans{ansArray[0], ansArray[1], ansArray[2]};
Run Code Online (Sandbox Code Playgroud)
这个解决方案是可行的,因为只有三个坐标。我可以将其模板化为一般长度吗?我想要类似相反的转换:std::to_array。
根据变量,我需要选择SeedPositions32或SeedPositions16数组以供进一步使用.我认为一个指针可以允许这个,但我无法播种使它工作.如何声明指向C++ 11 std :: array的指针?我试过以下.
array<int>* ArrayPointer;
//array<typedef T, size_t Size>* ArrayPointer;
array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,
47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
array<int,16> SeedPositions16 = {...}
Run Code Online (Sandbox Code Playgroud) 这些成员函数是否像它们看似无用而存在只是为了提供与其他容器的一致性?
例如:
std::array<int, 4> array1; // size of 4 (but no elements initialized)
std::array<int, 0> array2; // size of zero.
array1.empty(); // false - not empty even though no elements are initialized
array2.empty(); // true - empty and no way to add elements
array1.size(); // room for four now
array1.max_size(); // room for four forever
array2.size(); // no room for anything now
array2.max_size(); // ... or ever
Run Code Online (Sandbox Code Playgroud)
这个问题的答案是处理零"大小"参数和来自sizeof()的非零返回,即,即使在空的情况下也会占用空间.但那不是我要问的.
在N3337中,我正在阅读§23.3.2.1/ 3它说:
一个
array的容器的要求和可逆容器(23.2)的所有满足,不同之处在于一个默认构造array对象不为空,并且交换不具有恒定的复杂性.
在§23.2.1,表96容器需求中,它显示了X u;发布条件所在的默认构造对象u.empty().大概那么,以下内容:
std::array<int, 0> a;
Run Code Online (Sandbox Code Playgroud)
它应该与a.empty()输出结果一致1.那么"空"在这里意味着什么呢?
例如
class A : public std::array<int, 3>
{
};
Run Code Online (Sandbox Code Playgroud)
和
A a{1, 2, 3}; // failed currently.
Run Code Online (Sandbox Code Playgroud)
如何使数组的派生类型接受聚合初始化?
我想优化我的代码重载std :: array中的bracket []运算符,我在任何地方都减去一个.代码编译但从不调用重载函数,任何人都可以告诉我为什么?
#include <iostream>
#include <array>
class A
{
std::array<int,5> var{0, 1, 2, 3, 4};
std::array<int, 5ul>::value_type& operator[](std::size_t p_index);
};
std::array<int, 5ul>::value_type& A::operator[](std::size_t p_index)
{
return var[p_index - 1];
}
int main()
{
A a;
std::cout << a.var[1] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
代码返回"1"但我希望"0".提前致谢!
我有这样的模板类:
template<int dimension>
class Foo{
Foo(std::array<double, dimension>);
}
Run Code Online (Sandbox Code Playgroud)
和一个功能
func(Foo<1> f);
Run Code Online (Sandbox Code Playgroud)
我希望能够像这样调用函数和构造函数:
func(1);
Foo<1> f(1);
Run Code Online (Sandbox Code Playgroud)
代替
func({1});
Foo<1> f({1});
Run Code Online (Sandbox Code Playgroud)
有没有一个很好的方法来实现这一目标?
如果无法进行隐式转换,那么1 Foo<1>只能为案例添加构造函数吗?