template<typename OutputIterator>
void BlitSurface::ExtractFrames(OutputIterator it,
int frame_width, int frame_height,
int frames_per_row, int frames_per_column,
bool padding) const
{
SDL_Surface ** temp_surf = SDL_Ex_ExtractFrames(_surface, frame_width, frame_height, frames_per_row, frames_per_column, padding);
int surface_count = frames_per_row * frames_per_column;
for(int i=0; i<surface_count; ++i)
{
BlitSurface bs;
bs._surface = temp_surf[i];
*it = bs;
++it;
}
delete [] temp_surf;
}
J'ai cette fonction, qui fonctionne bien. Le seul problème est que je ne veux pas appeler le constructeur de copie, car il copie toute la surface, et j'ai seulement besoin de copier le pointeur. Je veux juste utiliser le constructeur par défaut, puis définissez le _surface membre à temp_surface [i], comme ceci:Comment éviter d'appeler le constructeur de copie avec des itérateurs d'insertion
for(int i=0; i<surface_count; ++i)
{
it->_surface = temp_surf[i];
++it;
}
qui fonctionne pour itérateurs normal, mais pas pour les itérateurs d'insertion. Comment puis-je le réparer pour travailler pour les deux?
Un adaptateur standard 'insert_iterator' est défini pour appeler' insert' du conteneur, qui, à son tour, est défini pour utiliser un constructeur de copie - IOW, 'insert_iterator' _must_ utilise une copie ctor, selon la norme. Vous aurez donc besoin de définir un adaptateur différent qui réduira la quantité de copie (vous aurez probablement toujours besoin de copier-construire au moins un élément nouvellement construit par défaut, si vous voulez utiliser l'insert d'un conteneur sous-jacent) méthode!). –
@Alex - J'ai eu une idée, mais je ne sais pas comment le faire. Je pourrais créer un objet par défaut (_surface = NULL). Puis ajoutez cela au conteneur. Le constructeur de copie dans ce cas serait juste de définir _surface à NULL. Ensuite, après le fait, je pourrais définir le membre de l'objet dans le conteneur. Mais encore une fois, je ne peux pas obtenir cela pour travailler avec des itérateurs d'insertion. Savez-vous comment faire cela? –
@user, l'implémentation standard de l'adaptateur 'insert_iterator' incrémente le pointeur d'insertion dans' operator = ', donc, encore une fois, vous ne pouvez pas le faire ** avec cet adaptateur spécifique **: vous devez implémenter _your propre_ l'adaptateur de l'itérateur à la place. –