Die Verwendung lokaler Klassen mit der STL-algorithmen
Ich habe mich immer gefragt, warum Sie nicht verwenden können lokal definierten Klassen von Prädikaten, um die STL-algorithmen.
In der Frage: Nähert sich die STL-algorithmen, lambda, lokale Klassen und andere Ansätze, BubbaT erwähnt, sagt, dass " Da der C++ - standard verbietet lokalen Typen als Argumente verwendet werden'
Beispiel-code:
int main() {
int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> v( array, array+10 );
struct even : public std::unary_function<int,bool>
{
bool operator()( int x ) { return !( x % 2 ); }
};
std::remove_if( v.begin(), v.end(), even() ); //error
}
Weiß jemand, wo in der Norm die Einschränkung? Was ist der Grund für die Nichtanerkennung lokalen Typen?
BEARBEITEN: Seit C++11, es ist legal zu verwenden, einen lokalen Typ als template-argument.
InformationsquelleAutor David Rodríguez - dribeas | 2009-04-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ausdrücklich verboten, die von der C++98/03-standard.
C++11 entfernen Sie die Einschränkung.
Vollständiger :
Quelle und mehr details : http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420
Fazit ist, dass die Beschränkung war ein Fehler wäre behoben wurden früher, wenn der standard entwickelt wurde schneller...
Sagte, dass heute die meisten letzten Versionen der gängigen Compilern erlaubt es, zusammen mit den lambda-Ausdrücken.
Beziehen Sie sich auf 14.3.1.2, "template-Typ-Argumente"?
Ich fügte hinzu, einige Informationen und einen link, der helfen könnte. Fazit ist, dass die Beschränkung war ein Fehler gewesen wäre schnell behoben, wenn die standard entwickelt wurde schneller...
Aber als ISO-standard ist es nicht, von der ISO-Regeln, entwickeln sich schneller als in 10-Jahres-Perioden. So zum Beispiel 98 standard existiert, so dass C++0x konnte nicht vor 2008, und von den blicken von ihm, die wir nicht haben, eine C++ - 1x, sondern eine C++ - 21 oder sowas. ISO-standards sind zu langsam...
Committee-Mitglieder, einschließlich Stroustrup, gesagt haben, dass die zehn Jahre timeclock war eine falsche interpretation der ISO-Regeln.
InformationsquelleAutor Klaim
Wird die Beschränkung aufgehoben in '0x, aber ich glaube nicht, dass Sie werden mit Ihnen sehr viel. Und das ist, weil C++-0x ist die lambdas! 🙂
Meine syntax in der oben genannten können nicht perfekt sein, aber die Allgemeine Idee ist es.
Und in welcher Weise ist dies eine Antwort auf die eigentliche Frage (geschweige denn ein Wert von 4-Stimmen)?
Ich kann sehen, warum würden Sie das sagen. Die Frage ist, warum sind Sie nicht erlaubt, und die erste Zeile der Antwort-Adressen dieser ie. es wurde entfernt, es muss also nicht ein guter Grund für die Einschränkung. Zu der Zeit habe ich deutlich dachte, lambdas waren erwähnenswert. Jetzt natürlich 3 Jahre später lambdas sind gut bekannt, so dass Sie keine Nachricht mehr!
InformationsquelleAutor Richard Corden