2017-05-12 5 views
0
#include<iostream> 
using namespace std; 
template<class T> 
class array1{ 
private: 
    T a; 
public: 
    array1(T b){ 
     a = b; 
    } 
    friend ostream& operator<<(ostream& out,array1 b){ 
     out << b.a; 
     return out; 
    } 
}; 
int main(){ 
    int* b = new int[2]; 
    b[0] = 5; 
    b[1] = 10; 
    array1<int*> num(b); 
    cout << num; 
    system("pause"); 
    return 0; 
}` 

Hier habe ich eine PRINT-Funktion gemacht, so dass es das Datenelement der Klasse drucken wird. aber wenn ich Int verwenden wird, kann es leicht drucken, aber wenn ich int * verwenden werde, wie ich in meinem Code habe, oder wenn ich int ** in Linie array1 num (b) verwenden werde;Generische Druckfunktion für Vorlagenklasse

Ich möchte eine generische Druckfunktion machen für int, int * oder int **

Antwort

0

Sie eine Vorlage Magie zu dereferenzieren den Zeiger verwenden können. Natürlich können Sie das erste Element nur so drucken. Nachdem Sie das Array zu einem Zeiger zerfallen lassen, können Sie die Länge nicht mehr ermitteln.

#include <iostream> 
#include <type_traits> 

// https://stackoverflow.com/questions/9851594 
template < typename T > 
struct remove_all_pointers 
{ 
    typedef T type; 
}; 

template < typename T > 
struct remove_all_pointers < T* > 
{ 
    typedef typename remove_all_pointers<T>::type type; 
}; 


template < typename T > 
typename std::enable_if< 
    std::is_same< T, typename remove_all_pointers<T>::type >::value, 
    typename remove_all_pointers<T>::type& 
    >::type 
dereference(T& a) 
{ 
    return a; 
} 

template < typename T > 
typename std::enable_if< 
    !std::is_same< T, typename remove_all_pointers<T>::type >::value, 
    typename remove_all_pointers<T>::type& 
    >::type 
dereference(T& a) 
{ 
    return dereference(*a); 
} 


template<class T> 
class array1 
{ 
private: 
    T a; 
public: 
    array1(T b){ 
     a = b; 
    } 
    friend std::ostream& operator<<(std::ostream& out,array1 b){ 
     out << dereference(b.a); 
     return out; 
    } 
}; 


int main() 
{ 
    int* b = new int[2]; 
    b[0] = 5; 
    b[1] = 10; 
    array1<int*> num(b); 
    std::cout << num << '\n'; 
} 

Online demo

Verwandte Themen