J'ai des classes qui utilisent habituellement des conteneurs standards comme champs sous-jacents. Par exemple, j'ai une classeComment implémenter des itérateurs standards dans la classe
template <typename T>
class Vec_3D
{
public:
/* ... */
std::array<T, 3> vec;
/* ... */
};
qui n'a qu'une seule variable vec
et le reste ne sont que des fonctions dont j'ai besoin lorsque vous travaillez avec des vecteurs. Je veux être en mesure d'utiliser en fonction de gamme tels que la boucle
Vec_3D<double> vec;
for (double val : vec) {/*...*/}
qui devrait obviusly itérer sur std::array<double, 3>
.
Comment implémenter des itérateurs dans ma classe qui devrait à son tour appeler des itérateurs de std::array<T, 3>
?
J'ai commencé avec this question et a essayé de définir des itérateurs dans ma classe comme
typedef std::iterator<std::random_access_iterator_tag, T, ptrdiff_t, T*, T&> iterator;
typedef std::iterator<std::random_access_iterator_tag, const T, ptrdiff_t, const T*, const T&> const_iterator;
inline iterator begin() noexcept { return vec.begin(); }
inline const_iterator cbegin() const noexcept { return vec.cbegin(); }
inline iterator end() noexcept { return vec.end(); }
inline const_iterator cend() const noexcept { return vec.end(); }
mais nous avons eu des erreurs de compilation
error: no match for ‘operator!=’ (operand types are ‘Vec_3D<double>::iterator {aka std::iterator<std::random_access_iterator_tag, double, long int, double*, double&>}’ and ‘Vec_3D<double>::iterator {aka std::iterator<std::random_access_iterator_tag, double, long int, double*, double&>}’)
et operator++, operator*
'std :: itérateur' n'est pas ce que vous pensez qu'il est –