Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I';我想包装std::array来创建一个循环数组,但是如何提供聚合初始化呢_C++_Arrays_C++14_Stdarray_Aggregate Initialization - Fatal编程技术网

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