c++ - 我想包装 std::array 以创建循环数组,但如何提供聚合初始化

标签 c++ arrays c++14 stdarray aggregate-initialization

使用 std::array 你可以做到

std::array<int,3> v = {1,2,3};

但我想提供一个包装器

template <typename T, int n> circular_array {
   auto operator[](size_t i){
       return m_data[i%n];  
   }
   // TODO forward all other methods directly except ``at`` which we don't need
 private:
   std::array<t,n> m_data;
}

但是我丢失了上面的 std::array 的聚合初始化。这是行不通的。

circular_array<int,3> v = {1,2,3};

不过,如果我将 m_data 公开,我就可以做到

circular_array<int,3> v = {{1,2,3}};

这不是我们想要的。

有没有办法实现circular_array作为std::array的替代品,包括聚合初始化?

最佳答案

不确定这是否正是您正在寻找的,但您可以使用继承(即从 std::array 派生您的类)而不是组合(即具有 std:array 数据成员)。

这是一个演示:

#include <array>
#include <iostream>

template <typename T, int n>
class circular_array : public std::array<T, n>
{
public:
    auto operator[](size_t i) {
        return std::array<T, n>::data()[i % n];
    }
};

int main()
{
    circular_array<int, 3> v = {1,2,3};
    for (size_t i = 0; i < 10; ++i) {
        std::cout << v[i] << std::endl;
    }
    return 0;
}

我已在 Visual Studio (Windows) 中测试了此代码,它按预期工作; native MSVC 编译器不提供任何诊断(即使在代码分析模式下),但 clang-cl 会针对聚合初始化发出以下信息(当对 native std:array 对象使用此类语法时,它不会给出):

warning : suggest braces around initialization of subobject [-Wmissing-braces]

不是语言律师,我不确定这是否意味着 circular_array<int, 3> v = {1,2,3};真正仍然是聚合初始化;但是,如果不是,那么我同样不确定它是什么。

关于c++ - 我想包装 std::array 以创建循环数组,但如何提供聚合初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66965561/

相关文章:

c++ - 在 C++ 中使用 __asm 将 short 类型的变量移动到 EAX(VS 2010)

c++ - 外部关键字和未解析的外部符号

c++ - 这段代码片段的作用是什么?

arrays - Postgresql 使用函数检查数组中所有单个元素的约束

javascript - 检索对象项的路径

c++11 - std::move 与 lambda 中的 std::shared_ptr

c++ - 如何将 gdb 用于多线程网络程序

java - 二维数组行列长度

c++ - 为什么虚函数不能使用返回类型推导?

c++ - `std::unique_ptr` 的(不同的)助手