如何在运行时使用 array<int,10> 或 array<int,4>?
How to use either array<int,10> or array<int,4> at runtime?
我希望我的代码根据运行时值使用数组的短版本或长版本(其中包含更多元素)。
constexpr std::array<int, 10> longArray{0,1,2,3,4,5,6,7,8,9};
constexpr std::array<int,4> shortArray{0,3,6,9};
auto const& myArray = useShortArray ? shortArray : longArray;
for( auto n : myArray ) {
// Do the stuff
}
和上面一样,因为三元运算符的参数不一样,所以出错了。
我该怎么做?
唯一的方法是声明两个分配的开始和结束迭代器。但这会导致在迭代器上使用旧的 for
并且需要在 for
块中的每次使用时取消引用迭代器。
auto const& myBegin = useShortArray ? shortArray.begin() : longArray.begin();
auto const& myEnd = useShortArray ? shortArray.end() : longArray.end();
for( auto it = myBegin ; it != myEnd ; ++it ) {
// use *it
}
是否有一些方法可以编写它(也许将数组复制到向量?)以避免恢复到 begin/end 版本?
例如,您可以使用 lambda:
auto doTheStuff = [](auto& myArray) {
for(auto n : myArray) {
// Do the stuff
}
};
useShortArray ? doTheStuff(shortArray) : doTheStuff(longArray);
或者,如果您想给它起一个名字,这可以是一个模板函数。
另一种做法是使用span,比如C++20即将推出的std::span
。在这种方法中,接受不同大小数组的模板函数是跨度的构造函数。这样使用范围的函数就不需要是模板了。
我希望我的代码根据运行时值使用数组的短版本或长版本(其中包含更多元素)。
constexpr std::array<int, 10> longArray{0,1,2,3,4,5,6,7,8,9};
constexpr std::array<int,4> shortArray{0,3,6,9};
auto const& myArray = useShortArray ? shortArray : longArray;
for( auto n : myArray ) {
// Do the stuff
}
和上面一样,因为三元运算符的参数不一样,所以出错了。
我该怎么做?
唯一的方法是声明两个分配的开始和结束迭代器。但这会导致在迭代器上使用旧的 for
并且需要在 for
块中的每次使用时取消引用迭代器。
auto const& myBegin = useShortArray ? shortArray.begin() : longArray.begin();
auto const& myEnd = useShortArray ? shortArray.end() : longArray.end();
for( auto it = myBegin ; it != myEnd ; ++it ) {
// use *it
}
是否有一些方法可以编写它(也许将数组复制到向量?)以避免恢复到 begin/end 版本?
例如,您可以使用 lambda:
auto doTheStuff = [](auto& myArray) {
for(auto n : myArray) {
// Do the stuff
}
};
useShortArray ? doTheStuff(shortArray) : doTheStuff(longArray);
或者,如果您想给它起一个名字,这可以是一个模板函数。
另一种做法是使用span,比如C++20即将推出的std::span
。在这种方法中,接受不同大小数组的模板函数是跨度的构造函数。这样使用范围的函数就不需要是模板了。