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


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.