Ho una classe X, che fornisco un frammento di qui:Concatenazione C++ iteratore spazia in una variabile membro vettore const in fase di costruzione
class X {
public:
template <typename Iter>
X(Iter begin, Iter end) : mVec(begin, end) {}
private:
vector<Y> const mVec;
};
Ora voglio aggiungere un nuovo costruttore di concatenare a questa classe, qualcosa di simile:
template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2) : mVec(???) { ??? }
Tale un costruttore sarebbe catenate le due catene [begin1, END1) e [begin2, FINE2) in mVec. Le sfide sono
1) vorrei preservare il const su mVec, in modo che sia considerato costante durante gli altri metodi di X.
2) Vorrei evitare copie non necessarie, se possibile. Cioè, una soluzione è quella di avere un metodo statico che costruisce un non-const temporanea per variare 1, inserti variano 2 e lo restituisce, e quindi definire il costruttore concatenazione di
template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2)
: mVec(concatenate(begin1, end1, begin2, end2)) { }
ma che copia tutti i valori a almeno una volta in più, credo.
+1 per una soluzione intelligente ... un iteratore che si estende su due gamme di iteratori ... bello – veefu
Sarebbe più facile scrivere usando boost :: iterator_facade, ma probabilmente è la soluzione migliore in questo caso. Almeno, finché non avremo il supporto per il trasloco. – Macke
Non vedo la necessità di concat_end. È possibile confrontare l'iteratore generato con il tipo T2 del valore e2 ang generare un bool. –