Platform: C++17, VS2017 (und GCC)
zum Kompilieren: https://godbolt.org/z/55Yjd578K
Ich hab versucht ein ultra abgespecktes Beispiel zu machen - so
nicht mehr ganz sinnvoll - aber es enthält alle Stellen die für mich
wichtig
sind
Problem: in der Result::fetch fehlt mir der Index
[1-sizeof...(OutputTypes)]
hat jemand eine Idee wie man das lösen kann?
Da soll am Ende ein typesafer-rer SQLite Wrapper werden
1
template<typenameT>
2
structConverter;
3
4
template<>
5
structConverter<int>
6
{
7
staticintvalue(intindex_){return12345;/* hier wird normalerweise mit index_ und mehr gearbeitet */};
8
};
9
10
template<>
11
structConverter<float>
12
{
13
staticfloatvalue(intindex_){return543.12f;/* hier wird normalerweise mit index_ und mehr gearbeitet */};
14
};
15
16
// ... es gibt viele weitere nicht primitiv-Typ Spezialisierungen
ich mache das Folding Zeug immer noch zu selten - ist ja nur ein
Parameter d.h. ganz normal mit Variable
und ich habe jetzt auch eine std::index_sequence Lösung die auch mit
Template-Parameter funktioniert - falls ich das dann doch mal brauche
cppbert schrieb:> und ich habe jetzt auch eine std::index_sequence Lösung die auch mit> Template-Parameter funktioniert - falls ich das dann doch mal brauche
Ja, richrig. index_sequence war mir jetzt zu frickelig.
Al Fine schrieb:> cppbert schrieb:>>> und ich habe jetzt auch eine std::index_sequence Lösung die auch mit>> Template-Parameter funktioniert - falls ich das dann doch mal brauche>> Ja, richrig. index_sequence war mir jetzt zu frickelig.
ja das war ein bisschen frickelig
Ich bin mir hier nicht sicher, ob die Reihenfolge der Ausführung von ++
beim Kommaoperator mit folding hier garantiert ist. Sonst könnte man auf
manchen Compilern falsche Werte bekommen.
M.K. B. schrieb:> Ich bin mir hier nicht sicher, ob die Reihenfolge der Ausführung von ++> beim Kommaoperator mit folding hier garantiert ist.
Das Komma ist kein Operator. Das ist das Trennzeichen einer "list
initialization". Ich glaube das Komma ist immer sequenzierend - außer
bei Funktionsparametern.
Essex schrieb im Beitrag #6739470:
> Wie kann man sich mit einer Sprache und solchen Fummeligkeiten nur so> abplagen?
Ich denke, man braucht - je nach Calling-Convention - weniger Stack,
wenn man die Werte für die Argumente in beliebiger Reihenfolge berechnen
kann.
Wilhelm M. schrieb:> output_ = []<auto... II>(std::index_sequence<II...>){> return Output{Converter<OutputTypes>::value(II + 1)...,};> }(std::make_index_sequence<size()>{});
So ist das c++20, oder?
> Wie kann man sich mit einer Sprache und solchen Fummeligkeiten nur so> abplagen?
wie kommst du darauf das sich irgendwer abplagt, die non template
variante hab ich in 5min komplett fertig geschrieben, aber mit der
template lib bekomme ich das viel kürzer, typesafe und generisch
erweiterbar, dafür nehme ich dann schon ein bisschen arbeit in kauf,
klar sieht C, C# und Python einfacher aus aber damit ists dann nicht
typesafe UND einfach zu nutzen und der End-Anwender sieht diesen Code ja
auch gar nicht
cppbert3 schrieb:>> Wie kann man sich mit einer Sprache und solchen Fummeligkeiten nur so>> abplagen?>> wie kommst du darauf das sich irgendwer abplagt,
Für manche Leute ist eben alles ein "int", und wenn nicht, dann ist es
ein "string". Das man Datentypen zur Compilezeit ausrechnen lassen kann,
ist dann unvorstellbar ...