29 Stimmen

Abfrage von if(T==int) mit Template-Klasse

Wenn ich eine Funktion in einer Vorlagenklasse schreibe, wie kann ich herausfinden, was mein T ist?

z.B..

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
if (typename T == int)
}

Wie kann ich die obige if-Anweisung so schreiben, dass sie funktioniert?

42voto

CB Bailey Punkte 693084

Etwa so:

template< class T >
struct TypeIsInt
{
    static const bool value = false;
};

template<>
struct TypeIsInt< int >
{
    static const bool value = true;
};

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
    if (TypeIsInt< T >::value)
    // ...
}

26voto

leemes Punkte 43469

Seit C++11 haben wir std::is_same :

if (std::is_same<T, int>::value) ...

Sie ist ähnlich wie die vorgeschlagene Eigenschaft implementiert TypeIsInt wie in den anderen Antworten vorgeschlagen, aber mit zwei zu vergleichenden Typen.

11voto

Artem Barger Punkte 39755

Definieren Sie sie ausdrücklich, z. B.:

template <>
ostream& operator << (ostream &out,Vector<int>& vec)
{
}

10voto

jalf Punkte 235501

Die einfachste und allgemeinste Lösung: Schreiben Sie einfach eine einfache alte Überladung der Funktion:

ostream& operator << (ostream &out,Vector<int>& vec)
{
// Your int-specific implementation goes here
}

Dies setzt voraus, dass die int und nicht int Versionen haben nicht viel gemeinsamen Code, da Sie zwei separate Implementierungen schreiben müssen.

WENN Sie eine gemeinsame Implementierung der Funktion verwenden wollen, mit nur einer if Anweisung innerhalb dieser Anweisung abweicht, verwenden Sie die Implementierung von Charles Bailey:

template< class T >
struct TypeIsInt
{
    static const bool value = false;
};

template<>
struct TypeIsInt< int >
{
    static const bool value = true;
};

template <typename T>
ostream& operator << (ostream &out,Vector<T>& vec)
{
    if (TypeIsInt< T >::value) {
      // your int-specific code here
    }
}

Verwenden Sie im Allgemeinen nicht typeid wenn Sie es nicht brauchen.

9voto

Am einfachsten ist es, eine Vorlagenspezialisierung vorzunehmen:

#include <iostream>
#include <vector>
using namespace std;

template <typename T> struct A {
};

template <typename T > 
ostream & operator <<( ostream & os, A<T> & a  ) {
    return os << "not an int" << endl;
}

template <> 
ostream & operator <<( ostream & os, A<int> & a  ) {
    return os << "an int" << endl;
}

int main() {
    A <double> ad;
    cout << ad;
    A <int> ai;
    cout << ai;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X