2010-08-20 5 views
5

Im folgenden Code:Was ist die Art von T?

template<typename T> 
struct X {}; 

int main() 
{ 
    X<int()> x; // what is the type of T ? 
} 

Was die Art der T? Ich habe so etwas in den boost Quellen gesehen.

+0

Ich wäre neugierig zu wissen, den Zweck der Verwendung dieser 'Syntax' (außer mit 'std :: function',' boost :: function' oder 'boost :: function_traits') – Tomaka17

+0

Aber wenn wir definieren ' int x = int() ', der Ausdruck' int() 'wird als Wert Initialisierung $ 8.5/7 behandelt. So ist es schwierig, ich denke – Chubsdad

+0

@chub: ein Typ wird dort erwartet, kein Wert. –

Antwort

12

Betrachten Sie die Funktion int func(). Es hat einen Funktionstyp int(void). Es kann implizit in den Zeigertyp konvertiert werden, wie der C++ - Standard in 4.3/1 sagt, aber in diesem Fall besteht keine Notwendigkeit für eine solche Umwandlung, so dass T den Funktionstyp int(void) hat, kein Zeiger darauf.

2

Hier ist was ich getan habe. Obwohl die Ausgabe von Code unten implementierungsspezifisch ist, gibt es oft einen guten Hinweis auf die Art von T, mit der wir es zu tun haben.

template<typename T> 
struct X { 
    X(){ 
     cout << typeid(T).name(); 
    } 
}; 

int main() 
{ 
    X<int()> x; // what is the type of T ? 
    cout << typeid(int()).name() << endl; 
} 

Die Ausgabe auf VC++ ist

int __cdecl (void)

int __cdecl (void)

0

Die Art der T eine Funktion, die keine Parameter annimmt und gibt int, wie in:

template<typename T> 
struct X {}; 

int foo() 
{ 
    return 42; 
} 
int main() 
{ 
    X<int()> x; // what is the type of T ? 
    typedef int(foo_ptr)(); 
    X<foo_ptr> x2; 
    return 0; 
} 

T in x und x2 sind vom gleichen Typ.

Verwandte Themen