Suche Idee für simpleres Template-Interface
-
Situation:
template <Arithmetic T, int M, int N> class Matrix { ... T m[M * N]; }; template <MatrixExpression E, int M, int N> class Submatrix { ... Submatrix(E& e, int i, int j); ... E& e; }; ... Matrix<float, 4, 4> m; Submatrix<decltype(m), 2, 2> s{ m, 1, 2 };
Das
decltype(m)
in Zeile 20 finde ich ziemlich redundant und würde gerne darauf verzichten:Submatrix<2, 2> s{ m, 1, 2 };
Theoretisch könnte der Typ ja aus dem ersten Konstruktor-Argument deduziert werden.
Ein Deduction Guide á la:
template <typename E, int M, int N> Submatrix(E&, int, int) -> Submatrix<E, M, N>;
Scheitert leider daran, dass Template-Parameter nicht partiell deduziert werden können.
Hat vielleicht jemand eine Idee wie man so was ohne allzuviel Boilerplate und Hilfklassen trotzdem irgendwie hingetrickst bekommt (partielle Deduktion von Template-Parametern wäre wirklich die schönste Lösung, wenn es denn ginge).
-
Ein Versuch:
#define Arithmetic typename #define MatrixExpression typename template <Arithmetic T, int M, int N> struct Matrix { T m[M * N]; }; template<int M, int N> struct Dim { }; template <MatrixExpression E, int M, int N> struct Submatrix { Submatrix(E& e, int , int ): e(e){} Submatrix(E& e, Dim<2,3>, int i, int j ): Submatrix(e, i, j ){} E& e; }; template <typename E, int M, int N> Submatrix(E&, Dim<M, N>, int, int) -> Submatrix<E, M, N>; int main() { Matrix<float, 4, 4> m; Submatrix s{ m, Dim<2,3>{}, 1, 2 }; }
-
@manni66 Das ist auf jeden Fall eine Lösung, leider nicht so schön intuitiv wie die nicht funktionierende partielle Deduktion und auch nur unwesentlich kürzer als das extra
decltype(m)
.Mir kam gerade beim rumprobieren noch eine andere Idee. Da es sich um experimentellen Code handelt, kann ich bereits C++20 verwenden (
MatrixExpression
ist z.B. bereits ein Concept).Unterstützt C++20 nicht auch
auto
-Funtkionsparameter? MSVC, das ich gerade verwende meckert bei mir noch miterror C3533: a parameter cannot have a type that contains 'auto'
, aber mir schwebt da so etwas vor:template <int M, int N> auto submatrix(auto& e, int i, int j) { return Submatrix<decltype(e), M, N>{ e, i, j }; } ... auto s = submatrix<2, 2>(m, 1, 2);
Könnte das funktionieren? Wäre eigentlich eine ziemlich coole Lösung - muss mir nur grad noch nen Compiler rauskramen, der das bereits frisst
-
@Finnegan sagte in Suche Idee für simpleres Template-Interface:
Unterstützt C++20 nicht auch auto-Funtkionsparameter?
Im Concetps-TS wars drin und wird auch vom gcc unterstützt. Ich meine auch, dass es in C++20 übernommen wurde, sicher bin ich aber nicht.
-
@manni66 Cool. Clang und GCC kompilieren das zumindest fehlerfrei: https://godbolt.org/z/h5rd1r.
Ich denke es war nicht unbedingt dafür gedacht, aber mit
auto
-Parametern unddecltype()
kann man sich zumindest für Funktionen einen funktional äquivalenten Ersatz für partiell deduzierte Template-Argumente selbst stricken. Frage mich, ob das auch ein paar neue Tricksereien für Klassentemplates erlaubt ...Edit (24.12.2020): Der Vollständigkeit halber, weil ich mich gerade wieder mit dem Code beschäftige. Das Feature mit den
auto
-Funktionsparametern nennt sich Abbreviated Function Template (C++20) und wird mittlerweile auch von MSVC unterstützt.