2016-03-29 5 views
2

Ich möchte eine Funktion, die den Wert Zeiger zurückgibt, unabhängig davon, welche Ebene von Zeiger es ist. Wie es könnte Einzel- oder Doppelzeiger OR Dreifachzeiger ODER mehr, aber diese Funktion sollte den Wert zurückgeben.Wie generische Funktion zu erstellen, die den Wert einer beliebigen Ebene des Zeigers in C++ zurückgibt?

Beispiel:

#include <iostream> 
using namespace std; 

template <class T> 
T func(T arg){ 
     // what to do here or there is some other way to do this????? 
} 

int main() { 
    int *p, **pp, ***ppp; 
    p = new int(5); 
    pp = &p; 
    ppp = &pp; 

    cout << func(p); // should print 5 
    cout << func(pp); // should print 5 
    cout << func(ppp); // should print 5 
    return 0; 
} 

So, jetzt möchte ich diese p, pp passieren, ppp in nur eine Funktion, und es sollte den Wert drucken oder zurückgeben '5'.

+0

Unmöglich. Aber warum glaubst du, dass du das brauchst? – Amit

+1

@Amit dachte ich einfach so, während ich vom Büro in mein Zimmer zurückkehrte: D –

+1

Ein dreifacher Zeiger * ist * ein doppelter Zeiger * und * ein einzelner Zeiger auch. In der Tat bietet die Berücksichtigung aller Zeiger als einzelne Zeiger ein besseres mentales Modell. Dass das Ziel eines Zeigers auch ein Zeiger ist, ist in einem generischen Sinn von sehr geringer Bedeutung, denn Zeigertypen sind durchaus gültige Typen. –

Antwort

10

haben nur eine Überlastung, die jeden Zeiger nimmt und nennt sich dereferenziert, und eine Überlastung, die alles nimmt:

template <class T> 
T func(T arg) { 
    return arg; 
} 

template <class T> 
auto func(T* arg){ 
    return func(*arg); 
} 

Dies ist sogar möglich, ohne 11 C++, muss nur eine Art Zug schreiben zu tun alle Dereferenzierung auch:

template <class T> 
struct value_type { typedef T type; }; 

template <class T> 
struct value_type<T*> : value_type<T> { }; 

template <class T> 
T func(T arg) { 
    return arg; 
} 

template <class T> 
typename value_type<T>::type func(T* arg){ 
    return func(*arg); 
} 
+0

könnten Sie plz einige Erklärung über zweite Methode hinzufügen .. wäre sehr hilfreich. –