Forum: PC-Programmierung C++ Template Meta pass_by_auto überprüfen.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sprachloser Dude (Gast)


Lesenswert?

Wie kann ich herausfinden ob mein pass_by_auto richtig funktioniert. In 
der Typ-ID ist nichts zu erkennen, weder mit g++ noch dmc.
1
# include <iostream>
2
# include <typeinfo>
3
using std :: cout;
4
using std :: endl;
5
template <bool B, typename T, typename F>
6
struct when {
7
        typedef T type;
8
};
9
template <typename T, typename F>
10
struct when <false, T, F> {
11
        typedef F type;
12
};
13
template <typename T>
14
struct pass_by_auto {
15
        typedef typename when <
16
                sizeof (void*) <= sizeof (T)
17
                , T
18
                , T const&
19
                > :: type type;
20
};
21
template <typename T>
22
void f (typename pass_by_auto <T> :: type t) {
23
        cout << sizeof (t) << " Byte long = " << typeid (t) . name () << endl;
24
}
25
void g (int const& t) {
26
        cout << sizeof (t) << " Byte long = " << typeid (t) . name () << endl;
27
}
28
struct s {
29
        long i;
30
        double r;
31
};
32
int main (int argc, char** argv) {
33
        g (argc);
34
        f <int> (argc);
35
        f <char**> (argv);
36
        f <s> (s ());
37
        s o; f <s> (o);
38
}
1
% g++ -std=c++98 -pedantic -otest test.cpp
2
% ./test
3
4 Byte long = i
4
4 Byte long = i
5
8 Byte long = PPc
6
16 Byte long = 1s
7
16 Byte long = 1s
1
>dmc test.cpp
2
>.\test.exe
3
4 Byte long = int
4
4 Byte long = int
5
4 Byte long = char **
6
16 Byte long = s
7
16 Byte long = s

von Programmierer (Gast)


Lesenswert?

Versuch doch einfach innerhalb der Funktion einen Wert in den Parameter 
zu schreiben. Wenn's nicht klappt, wars die konstante Referenz.
Warum benutzt du nicht std::conditional_t ?
So ginge es doch praktischer:
1
template <typename T>
2
using pass_by_auto = std::conditional_t<
3
                sizeof (void*) <= sizeof (T)
4
                , T
5
                , T const&
6
                >;
7
8
template <typename T>
9
void f (pass_by_auto <T> t) {
10
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Sprachloser Dude schrieb:
> Wie kann ich herausfinden ob mein pass_by_auto richtig funktioniert.

Du könntest in ein paar Test-Aufrufen ein static_assert auf den Test, 
auf den erwarteten Typen machen:
1
void f( typename pass_by_auto<std::string>::type )
2
{
3
    static_assert(
4
        std::is_same<
5
            typename pass_by_auto<std::string>::type, 
6
            const std::string& >::value);
7
}

von Sprachloser Dude (Gast)


Lesenswert?

Programmierer schrieb:
> Versuch doch einfach innerhalb der Funktion einen Wert in den Parameter
> zu schreiben. [...]

Torsten R. schrieb:
> [...] Du könntest in ein paar Test-Aufrufen ein static_assert auf den Test,
> auf den erwarteten Typen machen: [...]

Ok, habs mal so gemacht.

Programmierer schrieb:
> [...] Warum benutzt du nicht std::conditional_t ? [...]

Long story short, weil ich vor Jahren SICP [1] angelesen hab und 
kürzlich Category Theory for Programmers [2]. Und da ja 
C++‑Template‑Metaprogrogrammirung rein funktionale Programmierung ist 
versuch da grad verständnismäßig die Brücke von Haskell und auch Scheme 
zu den neueren Features in C++ zu schlagen.

[1] 
https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html
[2] 
https://github.com/hmemcpy/milewski-ctfp-pdf/releases/download/v1.3.0/category-theory-for-programmers.pdf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.