Heim >Backend-Entwicklung >C++ >Warum gibt es in Boost.TypeTraits kein „is_complete'-Template?

Warum gibt es in Boost.TypeTraits kein „is_complete'-Template?

Linda Hamilton
Linda HamiltonOriginal
2024-10-31 04:07:53983Durchsuche

 Why is there no `is_complete` template in Boost.TypeTraits?

Is_Complete-Vorlage in der Boost-Bibliothek

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 &amp; getT();   
      static char (&amp; 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn