Bei der Suche nach einer is_complete-Vorlage in der Boost-Bibliothek wurde deutlich, dass eine solche Vorlage in Boost.TypeTraits nicht existiert. Dies wirft Fragen nach dem Grund für das Fehlen und dem möglichen Design einer solchen Vorlage auf.
Bedenken Sie den folgenden Codeausschnitt:
<code class="cpp">//! Check whether type complete template<typename T> struct is_complete { static const bool value = ( sizeof(T) > 0 ); }; ... // use it in such a way BOOST_STATIC_ASSERT( boost::is_complete<T>::value );</code>
Dieser Code ist fehlerhaft, da er „sizeof“ auf einen unvollständigen Typ anwendet ist illegal. Daher wird nach einer alternativen Lösung gesucht.
Ein möglicher Ansatz ist der Einsatz von SFINAE. Dies stellt jedoch eine Einschränkung dar, da das Problem im Allgemeinen nicht gelöst werden kann, ohne gegen die One Definition Rule (ODR) zu verstoßen.
Eine von Alexey Malistov vorgeschlagene plattformspezifische Lösung ist für MSVC mit einer geringfügigen Modifikation verfügbar:
<code class="cpp">namespace { template<class T, int discriminator> struct is_complete { static T & getT(); static char (& pass(T))[2]; static char pass(...); static const bool value = sizeof(pass(getT()))==2; }; } #define IS_COMPLETE(X) is_complete<X,__COUNTER__>::value</code>
Leider ist die Verwendung des __COUNTER__-Makros nicht standardisiert, was möglicherweise seine Anwendbarkeit auf verschiedene Compiler einschränkt.
Das obige ist der detaillierte Inhalt vonWarum gibt es in Boost.TypeTraits kein „is_complete'-Template?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!