使用 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/