2016-04-21 12 views
0

Ich teste eine Struktur, die ich für Vorlagenbedingungen verwenden möchte, aber ich habe einige seltsame Compilerfehler. Hier ist mein Code:bool und sizeof bedingte Vorlage

#include <type_traits> 
#include <string> 

template<typename T1, typename T2, 
    bool SAME_SIZE = (sizeof(T1)==sizeof(T2))> 
struct same_size 
{ 
    typedef typename std::false_type value; 
}; 
template<typename T1, typename T2> 
struct same_size<T1, T2, true> 
{ 
    typedef typename std::true_type value; 
}; 

int main() 
{ 
    if(same_size<char,unsigned char>::value) 
    { 
     printf("yes"); 
    } 
    system("PAUSE"); 
} 

ich kompilieren dies in Visual Studio 2015. Dies sind die Compiler-Fehler erhalte ich:

1> main.cpp 
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(18): error C2059: syntax error: ')' 
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(19): error C2143: syntax error: missing ';' before '{' 

Kann jemand etwas Licht, was hier vor sich geht?

+0

Es gibt keine Notwendigkeit für diese Typnamen in den 'typedef's. Eine andere Möglichkeit, Ihren Fehler zu beheben, ist es, 'value' -' if (same_size :: value {}) 'zu instanziieren, aber die Antwort von Sergey ist der richtige Weg, um dies zu beheben. – Praetorian

Antwort

2

Sie haben Ihre value als ein Typ, kein Wert. Sie können es also nicht in if Zustand verwenden. Das Beste, was Sie tun können, ist Vererbung zu verwenden und beim Tippen zu sparen. Wie so:

#include <type_traits> 
#include <string> 

template<typename T1, typename T2, 
    bool SAME_SIZE = (sizeof(T1)==sizeof(T2))> 
struct same_size : std::false_type 
{ 
}; 

template<typename T1, typename T2> 
struct same_size<T1, T2, true> : std::true_type 
{ 
}; 

int main() 
{ 
    if(same_size<char,unsigned char>::value) 
    { 
     printf("yes"); 
    } 
    system("PAUSE"); 
} 

Weitere (besser in meiner Sicht) Lösung von @GManNickG vorgeschlagen wurde:

template<typename T1, typename T2> 
struct same_size : std::integral_constant<bool, sizeof(T1) == sizeof(T2)> {}; 

Die Vorteile von oben sind, natürlich, weniger tippen und weniger fehleranfällig: in der ersten Lösung, könnten Sie immer noch same_size<int, int, false>::value schreiben und falsche Ergebnisse erhalten.

Und die Schönheit der zweiten Lösung ist, dass es nach wie vor kompatibel produzieren Typen mit true_type und false_type wird, wie letztere typedefs für entsprechende integral_constant ist.

Auf der Randnotiz, sehen Vorlage Metaprogrammierung und printf im selben Code ist wie Space Shuttle von einem Paar Pferde gezogen zu sehen.

+0

Ja, ich habe nur printf benutzt, weil ich versucht habe, Dinge zu testen. Vielen Dank! – Finke

+0

Warum denken Sie, dass sie immer die Leistung der Motoren der Raumfähre in Pferdestärken melden? Es ist so, dass sie wissen, wie viele sie benötigen, nur für den Fall. –

+0

'Vorlage Struktur Gleiche_Größe: Std :: Integral_Konstant {};', noch einfacher. (Oder 'std :: bool_constant <>' in C++ 17.) – GManNickG