Mezz'ora in debug passo passo, per poi scoprire che il debugger in toolbox prende granchi.
Dunque: il cast non è necessario (se proprio si vuole si può usare std::forward<wstring>() che fa la stessa cosa.
int main(etc) ...
std::vector<std::string> vecDb;
string a = "alpha";
string b = "beta";
string c = "gamma";
string d = "teta";
vecDb.push_back(a);
vecDb.push_back(b);
vecDb.push_back(c);
vecDb.push_back(d);
std::set<std::string> playList;
for (auto i=vecDb.begin(); i !=vecDb.end(); ++i) {
playList.insert(std::move(*i));
}
for (auto i=vecDb.begin(); i !=vecDb.end(); ++i) {
cout << *i << endl;
}
L'output è effettivamente vuoto (come ci si aspetta) anche senza mettere il cast.
La domanda iniziale era se c'era un modo migliore invece del ciclo. C'è. (Riporto la parte interessata).
vecDb.push_back(d);
std::set<std::string> playList;
// sposta la stringa ma solo con begin(), non cbegin()
std::move(vecDb.begin(),vecDb.end(),std::inserter(playList,playList.begin()));
for (auto i=vecDb.begin(); i !=vecDb.end(); ++i) {
cout << *i << endl;
}
[
Come riportato nel commento, il giochino funziona solo se non si passa un const_iterator con cbegin() (in effetti essendo costante non può modificare il contenuto). L'output resta vuoto.
Io suggerirei di modificare in questo modo:
bool CPlaylistManager::AddPlaylist(const std::wstring & directoryPath,const std::wstring & name)
{
std::vector<std::vector<std::wstring> > songsInPath;
//quì è ciò che viene restituito dal database dalla funzione Search del database Handler
//sta funzione ritorna true se è riuscito a trovare delle canzoni nel directoryPath e li mette nel
songpath[0].
//E' un algoritmo un pò complicato che funziona a seconda del tipo di search.
if(m_databaseHandler.Search(SEARCH_BY_PATH,directoryPath,songsInPath,true))
{
auto thisPlayList = std::make_shared<CPlaylist>();
auto it = m_allPlaylists.insert(std::make_pair(name,thisPlayList));
if(it.second)
{
// Si sposta il vector da qui alla funzione. Usando il move si
// rafforza l'idea che da qui il vector deve sparire.
it.first->second->CreatePlaylist(std::move(songsInPath[0]));
// songPath[0] è il vettore in questione che dopo esere inserito nel set della classe
// Cplaylist (sviluppo sotto) non verrà + usato e quindi distrutto
// all'uscita della funzione AddPlaylist.
it.first->second->SetPlayListName(name);
m_selectedPlaylist = it.first;
}
}
if(m_selectedPlaylist != m_allPlaylists.end())
m_selectedPlaylist->second->ShufflePlaylist();
return true;
}
// Un reference ritengo sia meglio usarlo quando si vuole che il contenuto del vector resti valido
// durante la chiamata.
bool CPlaylist::CreatePlaylist(const std::vector<std::wstring>&& directoryPath)
{
//quì c'è l'inserimento che ti dicevo
//playList è il set che è un membro della classe CPlayList
// Si spostano gli elementi dal vector al set usando begin().
std::move(directoryPath.begin(),directoryPath.end(),std::inserter(playList,playList.begin()));
//quì poi ci sono dei iterator per trovare + velocemente i file ma non c'entra col problema
for(auto it = playList.begin(); it != playList.end(); ++it)
playListPointer.push_back(it);
unShuffledplayListPointer = playListPointer;
playListCounter = playListPointer.begin();
return true;
}
Ah. Come sempre:
This code and information is provided "as is" without warranty of any kind, either expressed
or implied, including but not limited to the implied warranties of merchantability and/or
fitness for a particular purpose.