我希望我的代码可以根据运行时的值,使用数组的短版本或长版本(包含更多元素)。
有没有一些方法可以编写它(也许是将数组复制到向量中?)以避免回归到最初/结束版本?
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
}
有没有一些方法可以编写它(也许是将数组复制到向量中?)以避免回归到最初/结束版本?
std::span
(C++20)可能会有所帮助(但它主要是begin/end迭代器,但作为范围)。 - Jarod42template <typename T> SomeType do_job(const T& array) {/*...*/}
然后return useShortArray ? do_job(shortArray) : do_job(longArray);
。 - Jarod42auto begin = useShortArray ? shortArray.begin() : longArray.end()
只是偶然能够工作的,因为std::array<T,N>::iterator
类型可能取决于N
(并且在 MS STL中确实如此)。 - Kirill Dmitrenkoconstexpr std::array<int, 10> longArray
;-) - Jarod42constexpr std::array<int, 13> bothArrays
呢? :P - Paul Evans