Ich habe einige duplizierten Code, in dem ich von zwei Strömen lesen,Für die Bereichsschleife für einen nicht kopierbaren Typ, ist es möglich?
{
std::ifstream ifs("A.dat");
... code ...
}
{
std::ifstream ifs("B.dat");
... same code ...
}
Ich wollte beide in einer Schleife vereinen. Die erste Reaktion ist, dies zu tun:
for(auto ifs : {ifstream("A.dat"), ifstream("B.dat")})
{
... code ...
}
aber es nicht kompiliert, da der Typ nicht kopierbar ist, so habe ich versucht, dies:
for(auto& ifs : {ifstream("A.dat"), ifstream("B.dat")})
{
... code ...
}
, die nicht da ifs
innerhalb der funktioniert Schleife ist const
. (A const ifstream
kann nicht verwendet werden.) Dies entweder nicht funktioniert hat, ich glaube, aus dem gleichen Grunde:
for(auto&& ifs : {ifstream("A.dat"), ifstream("B.dat")})
Am Ende natürlich ich das am Ende tun.
#include<iostream>
int main(){
for(auto& name : {"A.dat", "B.dat"})
{
std::ifstream ifs(name);
... code ...
}
Aber ich bin immer noch neugierig, ob es möglich ist, wie std::ifstream
mit einer Art direkt für-Loop-Bereich zu haben?
Stream Iteratoren nachschlagen, obwohl ich Zweifel ranged-for wird dir viel helfen ohne hässliche hax –
@LightnessRacesinOrbit, hacks, ja, ich fand, dass ich 'const_cast' die for-loop-Variable, das ist schon ziemlich hässlich. – alfC
Eine 'initializer_list' erlaubt nur den 'const'-Zugriff auf ihre Elemente, so dass Sie nicht tun können, was Sie wollen, ohne irgendwo Hässlichkeit zu suchen. – Praetorian