Generisches Dienstprogramm, um Aribatry-Tupel von Integral_Constants zu erzeugen

8

Unter Verwendung von Scott Schurr's str_const habe ich eine constexpr string.

%Vor%

Ich habe eine weitere Funktion constexpr , die die Position des ersten Caret in einer Zeichenfolge zurückgibt, beginnend mit der Position n:

%Vor%

Ich kann die Ergebnisse von caretPos verwenden, um einen typedef für std::tuple von std::integral_constants zu erstellen, wobei die Größe des Tupels die Anzahl der in der Zeichenfolge gefundenen Einträge und jedes Tupelelement eine ganzzahlige Konstante ist deren Wert ist die Position des Caret in der Zeichenfolge.

Hier konstruiere ich dieses Tupel manuell:

%Vor%

Frage:

Ich möchte dies nun für jede Eingabezeichenfolge mit einer beliebigen Anzahl von Einträgen verallgemeinern.

%Vor%

Wie kann ich die Sequenz von Ns... hier mit caretPos oder anderen Mitteln erzeugen?

Arbeitsbeispiel

    
Steve Lorimer 09.04.2017, 22:16
quelle

3 Antworten

1

Faszinierende Frage.

Die Verwendung von StrConst wird vermieden. Im folgenden Beispiel sehen Sie, wie Sie einen std::tuple<std::integral_constant<std::size_t, Pos1>, std::integral_constant<std::size_t, Pos2>, ...> -Typ erhalten.

Verwenden Sie zunächst arrayConverter() , um char const * in std::array<char, N> ( lc , im folgenden Code) zu konvertieren; Zweitens: Verwenden Sie tupleIndexGenerator<lc.size(), lc, '^'>::type , um den angeforderten Typ zu erhalten.

Wenn also "hello^world^" die Zeichenfolge ist, erhalten Sie tupleIndexGenerator<lc.size(), lc, '^'>::type std::tuple<std::integral_constant<std::size_t, 5U>, std::integral_constant<std::size_t, 11U>>

Der Code

%Vor%     
max66 10.04.2017, 13:40
quelle
1
___ qstnhdr ___ Generisches Dienstprogramm, um Aribatry-Tupel von Integral_Constants zu erzeugen ___ antwort43313964 ___

Hier ist das Beste, was ich tun kann mit Scotts String:

%Vor%

Mit normalen String<'a', 'b', 'c'> und Werten, die nicht in Typen codiert sind, sind wir etwas begrenzter. Wir können einfach kein Tupel von Integralkonstanten bilden, weil der String-Inhalt im Parameter in konstanten Ausdrücken unbrauchbar ist. Stattdessen habe ich einen kleinen consExpr-Vektor erstellt, den wir genau wie einen Runtime-Knoten verwenden können, um Standorte nach Bedarf zu verschieben. Aber selbst dann können wir keine dynamischen Zuordnungen während der Kompilierung vornehmen, sodass die maximale Größe benötigt wird ein Vorlagenparameter sein. Mit C ++ 11 können Sie das möglicherweise auch rekursiv statt iterativ schreiben, aber ich bin mir nicht sicher, wie Sie String implementieren würden. Sie müssen das Array kopieren und einen Wert ändern. Soweit ich weiß, müssten Sie dies über eine Initialisierungsliste für das Array tun und würden im Wesentlichen ein Parameterpaket mit Indizes benötigen, dessen Größe auf einer Variablen basiert, die kein konstanter Ausdruck ist, was möglich ist (obwohl ich weiß nicht über C ++ 11), aber wirklich kompliziert .

    
___ tag123c14 ___ C ++ 14 ist der Name des C ++ - Standards, der 2014 genehmigt wurde. Er baut auf dem vorherigen C ++ 11-Standard auf und verbessert die Kernsprache und die Standardbibliothek sowie einige Funktionen. ___ tag123templatemetaprogramming ___ Template Metaprogrammierung ist eine Metaprogrammierungstechnik, bei der Templates von einem Compiler verwendet werden, um temporären Quellcode zu generieren, der vom Compiler mit dem Rest des Quellcodes zusammengeführt und dann kompiliert wird. ___ qstntxt ___

Unter Verwendung von Scott Schurr's constexpr habe ich eine %code% string.

%Vor%

Ich habe eine weitere Funktion %code% , die die Position des ersten Caret in einer Zeichenfolge zurückgibt, beginnend mit der Position n:

%Vor%

Ich kann die Ergebnisse von %code% verwenden, um einen typedef für %code% von %code% zu erstellen, wobei die Größe des Tupels die Anzahl der in der Zeichenfolge gefundenen Einträge und jedes Tupelelement eine ganzzahlige Konstante ist deren Wert ist die Position des Caret in der Zeichenfolge.

Hier konstruiere ich dieses Tupel manuell:

%Vor%

Frage:

Ich möchte dies nun für jede Eingabezeichenfolge mit einer beliebigen Anzahl von Einträgen verallgemeinern.

%Vor%

Wie kann ich die Sequenz von %code% hier mit %code% oder anderen Mitteln erzeugen?

Arbeitsbeispiel

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer43324813 ___

Faszinierende Frage.

Die Verwendung von %code% wird vermieden. Im folgenden Beispiel sehen Sie, wie Sie einen %code% -Typ erhalten.

Verwenden Sie zunächst %code% , um %code% in %code% ( %code% , im folgenden Code) zu konvertieren; Zweitens: Verwenden Sie %code% , um den angeforderten Typ zu erhalten.

Wenn also %code% die Zeichenfolge ist, erhalten Sie %code% %code%

Der Code

%Vor%     
___ antwort43313935 ___

Hier ist ein Beispiel mit Boost.Hana (welches C ++ 14 bewirbt). Es ergibt sich ein Tupel von Integralkonstanten, was direkt gefragt ist.

%Vor%

Die meiste Arbeit ist um die Tatsache herumgekommen, dass jeder Wert ein anderer Typ ist. Hana codiert die Werte als Teil des Typs, dh es ist möglich, einen Parameter in einem konstanten Ausdruck zu verwenden. Zum Beispiel ist eine Hana-Zeichenfolge vom Typ %code% für einige künstliche %code% . Das heißt, wenn ein Parameter zum Vergleichen eines Zeichens verwendet wird, ist dieses Zeichen als Teil des Typs bekannt. Dies unterscheidet sich von Scotts String, der auf %code% voll ist und einen Parameter nicht auf einen konstanten Ausdruck innerhalb der Funktion heben kann.

    
___ tag123boosthana ___ Boost.Hana ist eine C ++ 14-basierte Metaprogrammierungsbibliothek. Es bietet High-Level-Algorithmen, um heterogene Sequenzen zu manipulieren, ermöglicht das Schreiben von Typ-Level-Berechnungen mit einer natürlichen Syntax, bietet Werkzeuge, um benutzerdefinierte Typen zu introspizieren und vieles mehr. ___
chris 10.04.2017 01:53
quelle
1
___ qstnhdr ___ Generisches Dienstprogramm, um Aribatry-Tupel von Integral_Constants zu erzeugen ___ antwort43313964 ___

Hier ist das Beste, was ich tun kann mit Scotts String:

%Vor%

Mit normalen constexpr und Werten, die nicht in Typen codiert sind, sind wir etwas begrenzter. Wir können einfach kein Tupel von Integralkonstanten bilden, weil der String-Inhalt im Parameter in konstanten Ausdrücken unbrauchbar ist. Stattdessen habe ich einen kleinen consExpr-Vektor erstellt, den wir genau wie einen Runtime-Knoten verwenden können, um Standorte nach Bedarf zu verschieben. Aber selbst dann können wir keine dynamischen Zuordnungen während der Kompilierung vornehmen, sodass die maximale Größe benötigt wird ein Vorlagenparameter sein. Mit C ++ 11 können Sie das möglicherweise auch rekursiv statt iterativ schreiben, aber ich bin mir nicht sicher, wie Sie push_back implementieren würden. Sie müssen das Array kopieren und einen Wert ändern. Soweit ich weiß, müssten Sie dies über eine Initialisierungsliste für das Array tun und würden im Wesentlichen ein Parameterpaket mit Indizes benötigen, dessen Größe auf einer Variablen basiert, die kein konstanter Ausdruck ist, was möglich ist (obwohl ich weiß nicht über C ++ 11), aber wirklich kompliziert .

    
___ tag123c14 ___ C ++ 14 ist der Name des C ++ - Standards, der 2014 genehmigt wurde. Er baut auf dem vorherigen C ++ 11-Standard auf und verbessert die Kernsprache und die Standardbibliothek sowie einige Funktionen. ___ tag123templatemetaprogramming ___ Template Metaprogrammierung ist eine Metaprogrammierungstechnik, bei der Templates von einem Compiler verwendet werden, um temporären Quellcode zu generieren, der vom Compiler mit dem Rest des Quellcodes zusammengeführt und dann kompiliert wird. ___ qstntxt ___

Unter Verwendung von Scott Schurr's %code% habe ich eine %code% string.

%Vor%

Ich habe eine weitere Funktion %code% , die die Position des ersten Caret in einer Zeichenfolge zurückgibt, beginnend mit der Position n:

%Vor%

Ich kann die Ergebnisse von %code% verwenden, um einen typedef für %code% von %code% zu erstellen, wobei die Größe des Tupels die Anzahl der in der Zeichenfolge gefundenen Einträge und jedes Tupelelement eine ganzzahlige Konstante ist deren Wert ist die Position des Caret in der Zeichenfolge.

Hier konstruiere ich dieses Tupel manuell:

%Vor%

Frage:

Ich möchte dies nun für jede Eingabezeichenfolge mit einer beliebigen Anzahl von Einträgen verallgemeinern.

%Vor%

Wie kann ich die Sequenz von %code% hier mit %code% oder anderen Mitteln erzeugen?

Arbeitsbeispiel

    
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer43324813 ___

Faszinierende Frage.

Die Verwendung von %code% wird vermieden. Im folgenden Beispiel sehen Sie, wie Sie einen %code% -Typ erhalten.

Verwenden Sie zunächst %code% , um %code% in %code% ( %code% , im folgenden Code) zu konvertieren; Zweitens: Verwenden Sie %code% , um den angeforderten Typ zu erhalten.

Wenn also %code% die Zeichenfolge ist, erhalten Sie %code% %code%

Der Code

%Vor%     
___ antwort43313935 ___

Hier ist ein Beispiel mit Boost.Hana (welches C ++ 14 bewirbt). Es ergibt sich ein Tupel von Integralkonstanten, was direkt gefragt ist.

%Vor%

Die meiste Arbeit ist um die Tatsache herumgekommen, dass jeder Wert ein anderer Typ ist. Hana codiert die Werte als Teil des Typs, dh es ist möglich, einen Parameter in einem konstanten Ausdruck zu verwenden. Zum Beispiel ist eine Hana-Zeichenfolge vom Typ %code% für einige künstliche %code% . Das heißt, wenn ein Parameter zum Vergleichen eines Zeichens verwendet wird, ist dieses Zeichen als Teil des Typs bekannt. Dies unterscheidet sich von Scotts String, der auf %code% voll ist und einen Parameter nicht auf einen konstanten Ausdruck innerhalb der Funktion heben kann.

    
___ tag123boosthana ___ Boost.Hana ist eine C ++ 14-basierte Metaprogrammierungsbibliothek. Es bietet High-Level-Algorithmen, um heterogene Sequenzen zu manipulieren, ermöglicht das Schreiben von Typ-Level-Berechnungen mit einer natürlichen Syntax, bietet Werkzeuge, um benutzerdefinierte Typen zu introspizieren und vieles mehr. ___
chris 10.04.2017 01:57
quelle