C++ I';我想包装std::array来创建一个循环数组,但是如何提供聚合初始化呢
使用C++ I';我想包装std::array来创建一个循环数组,但是如何提供聚合初始化呢,c++,arrays,c++14,stdarray,aggregate-initialization,C++,Arrays,C++14,Stdarray,Aggregate Initialization,使用std::array可以 std::array<int,3> v = {1,2,3}; 虽然如果我公开了m_数据,我可以 circular_array<int,3> v = {{1,2,3}}; 圆形_数组v={{1,2,3}; 这是不可取的 是否有一种方法可以实现循环数组作为std::array的一个下拉菜单,包括聚合初始化?不确定它是否正是您想要的,但您可以使用继承(即从std::array派生类)而不是组合(即拥有std:array数据成员) 下面是一个演
std::array
可以
std::array<int,3> v = {1,2,3};
虽然如果我公开了m_数据,我可以
circular_array<int,3> v = {{1,2,3}};
圆形_数组v={{1,2,3};
这是不可取的
是否有一种方法可以实现
循环数组
作为std::array
的一个下拉菜单,包括聚合初始化?不确定它是否正是您想要的,但您可以使用继承(即从std::array
派生类)而不是组合(即拥有std:array
数据成员)
下面是一个演示:
#包括
#包括
模板
类循环数组:public std::array
{
公众:
自动操作员[](尺寸i){
返回std::array::data()[i%n];
}
};
int main()
{
圆形_数组v={1,2,3};
对于(尺寸i=0;i<10;++i){
解决方案是认识到必须实现同样的技巧。它通过将其单个成员公开而不是隐藏来实现这一点
所以(部分)解决方案是
#include <array>
#include <iostream>
template <typename T, int n>
class circular_array
{
private:
static
constexpr int Wrap(int kX) noexcept
{
if (kX < 0)
kX += n * (-kX / n + 1);
return kX % n;
}
public:
typename std::array<T,n>::reference operator[](int i) {
return m_data[Wrap(i)];
}
std::array<T,n> m_data;
};
int main()
{
circular_array<int, 3> v = {1,2,3};
std::cout << v[-3] << std::endl;
std::cout << v[-2] << std::endl;
std::cout << v[-1] << std::endl;
std::cout << v[0] << std::endl;
std::cout << v[1] << std::endl;
std::cout << v[2] << std::endl;
std::cout << v[3] << std::endl;
return 0;
}
就我所测试的而言,它可以一直工作到c++11
。我仍然需要实现所有其他的转发调用,但原理很清楚,尽管很麻烦
抛弃私人成员?如果你想进行聚合初始化,它需要有一个聚合。请看一看关于CPP的参考。简短回答:不。也许我在这里对语言律师要求聚合初始化太具体了。是否可以编写循环数组v={1,2,3}
使用某种方法?您可以提供可变模板构造函数模板循环数组(x_Initializer…Initializer):m_data{Initializer…}{}
您需要编译时大小,并且初始化器列表的运行时大小类似于向量。因为C++14有constepr size\u type size()const noeExcept;
但我不确定这如何解决问题。不幸的是,这不适用于-std=c++14,但适用于-std=c++17。发生了一些变化。@bradgonessurfing啊!我的错。不过,我现在把答案留在这里,这样当你升级到c++17(明年?)时,你可以回来使用它。
circular_array<int,3> v = {{1,2,3}};
#include <array>
#include <iostream>
template <typename T, int n>
class circular_array
{
private:
static
constexpr int Wrap(int kX) noexcept
{
if (kX < 0)
kX += n * (-kX / n + 1);
return kX % n;
}
public:
typename std::array<T,n>::reference operator[](int i) {
return m_data[Wrap(i)];
}
std::array<T,n> m_data;
};
int main()
{
circular_array<int, 3> v = {1,2,3};
std::cout << v[-3] << std::endl;
std::cout << v[-2] << std::endl;
std::cout << v[-1] << std::endl;
std::cout << v[0] << std::endl;
std::cout << v[1] << std::endl;
std::cout << v[2] << std::endl;
std::cout << v[3] << std::endl;
return 0;
}
1
2
3
1
2
3
1