Articles of c ++ 11

Überladene Lambdas in C ++ und Unterschiede zwischen clang und gcc

Ich spiele mit einem Trick, um Lambdas in C ++ zu überladen. Speziell: // For std::function #include // For std::string #include // For std::cout #include template struct overload : F… { overload(F… f) : F(f)… {} }; template auto make_overload(F… f) { return overload(f…); } int main() { std::function f = [](int x,int y) { […]

Vorlagenspezialisierung und enable_if Probleme

Ich stoße auf ein Problem in Bezug auf die angemessene Verwendung von enable_if und Template-Spezialisierung. Nach der Änderung des Beispiels (aus Gründen der Vertraulichkeit) folgt ein vergleichbares Beispiel: Ich habe eine function namens “less”, die prüft, ob 1. arg kleiner als 2. arg ist. Nehmen wir an, ich möchte 2 verschiedene Arten von Implementierungen haben, […]

Was macht dieser variable Template-Code?

template void for_each_argument(F f, Args&&… args) { [](…){}((f(std::forward(args)), 0)…); } Es wurde kürzlich auf isocpp.org ohne Erklärung vorgestellt.

Versetzt das Verschieben eines Vektors Iteratoren?

Wenn ich einen Iterator in den Vektor a , dann move-construct oder move-assigniere ich den Vektor b aus a , zeigt dieser Iterator immer noch auf dasselbe Element (jetzt in Vektor b )? Hier ist, was ich im Code bedeute: #include #include int main(int argc, char *argv[]) { std::vector::iterator a_iter; std::vector b; { std::vector a{1, […]

C ++ 11 static_assert und Template Instanziierung

In C ++ 11, sollte die Operation von static_assert innerhalb einer Vorlage davon abhängen, ob diese Vorlage instanziiert wurde oder nicht? Zum Beispiel mit dem folgenden Code template void sa() { static_assert(0,”Hello.”); } int main(int argc, char *argv[]) { return 0; } GCC 4.5.0 schlägt die Assertion fehl und erzeugt das “Hello”. Botschaft. Der Digital […]

Warum verhindert std :: move RVO?

In vielen Fällen, wenn ein Local von einer function zurückgegeben wird, tritt RVO ein. Ich dachte jedoch, dass die explizite Verwendung von std::move zumindest die Bewegung erzwingen würde, wenn RVO nicht auftritt, aber dass RVO immer noch angewendet wird, wenn es möglich ist. Dies scheint jedoch nicht der Fall zu sein. #include “iostream” class HeavyWeight […]

C ++ 0x Thread-Unterbrechung

Laut dem endgültigen Entwurf von C ++ 0x gibt es keine Möglichkeit, einen Thread zum Beenden anzufordern. Falls erforderlich, müssen wir eine Do-it-yourself-Lösung implementieren. Auf der anderen Seite bietet boost :: thread einen Mechanismus, um einen Thread auf sichere Weise zu unterbrechen. Was ist Ihrer Meinung nach die beste Lösung? Entcasting Sie Ihren eigenen kooperativen […]

rekursive variadische Vorlage, um den Inhalt eines Parameterpakets auszudrucken

Wie ist es möglich, eine rekursive variadische Vorlage zu erstellen, um den Inhalt eines Parameterpakets auszudrucken? Ich versuche damit, aber es kompiliert nicht: template std::string type_name () { return std::string(typeid(First).name()) + ” ” + type_name(); } std::string type_name () { return “”; } Wie soll ich die Rekursion beenden?

Wann verwenden Sie std :: begin und std :: end anstelle von containerspezifischen Versionen

Gibt es irgendwelche allgemeinen Vorlieben oder Regeln, die erklären, wenn containerspezifische Versionen von Beginn und Ende anstelle der freien functionen std::begin und std::end ? Wenn die function eine Vorlage ist, bei der der Containertyp ein Vorlagenparameter ist, dann sollte std::begin und std::end verwendet werden, also: template void do_stuff( const T& t ) { std::for_each( std::begin(t), […]

Was machen Compiler mit der Verzweigung zur Kompilierungszeit?

EDIT: Ich nahm den “if / else” -Fall als ein Beispiel, das manchmal zur Kompilierzeit aufgetriggers werden kann (zB wenn statische Werte beteiligt sind, vgl. ). Die folgenden Antworten sollten auf andere statische Verzweigungstypen (z. B. mehrere Verzweigungen oder Verzweigungen mit mehreren Kriterien) angepasst werden. Beachten Sie, dass die Verzweigung zur Kompilierungszeit mithilfe von Template-Meta-Programmierung […]