2014-11-19 9 views
80

In boost/mpl/assert.hpp, sah ich etwas wie folgt aus:Was bedeutet P :: ************ in Boost assert.hpp Datei?

template<class Pred> 
struct eval_assert { 
    typedef typename extract_assert_pred<Pred>::type P; 
    typedef typename P::type p_type; 
    typedef typename ::boost::mpl::if_c<p_type::value, 
     AUX778076_ASSERT_ARG(assert<false>), 
     failed ************ P::************ 
    >::type type; 
}; 

Wenn die erste ************ als Zeiger der Struktur gescheitert behandelt werden können, wird die P::************ wirklich keinen Sinn für mich. Ist das Standard C++?

+1

Ja. Es ist ein mehrstufiger Zeiger auf den Zeiger zum Mitglied von 'P'. –

+1

(Solche verschachtelten Zeiger existieren?: /) – deviantfan

+38

Pointerception ... –

Antwort

45

Es ist ein Zeiger-zu-Zeiger-zu -...-Mitglied des Typs P, wobei das Mitglied ein Datenelement des Typs Zeiger-zu-Zeiger-zu -...- failed ist.

In diesem Fall besteht das Ziel einfach darin, die Kompilierung fehlzuschlagen, indem auf ein Mitglied von P mit einer sehr hohen Wahrscheinlichkeit verwiesen wird, dass es nicht existieren wird. In C++ 11 würden Sie stattdessen einfach static_assert verwenden, aber natürlich muss Boost portabel sein für Dialekte vor C++ 11.

19

F P::* ist ein "Zeiger auf Mitglied P des Typs F".

F P::** ist ein "Zeiger auf Zeiger auf P des Typs F".

Mehr * s fügt mehr "Zeiger zu" vor.

In diesem Fall ist Ffailed ************, d. H. "Zeiger auf Zeiger zu ... Zeiger auf failed".

+3

Sehr einfach, aber auf den Punkt :) – ha9u63ar

100

Der Sinn dieses Codes ist es, dem Compiler zu helfen, "sichtbare" Fehlermeldungen zu erzeugen.

In vor static_assert Ära, compiling ein Template-schweren Code könnte leicht produzieren ~ 100 Zeilen von Fehlermeldungen sogar für einen einzigen Fehler, und 99% dieser Zeilen sind oft bedeutungslos.

Der 10-Pointer Trick ist nützlich, um die tatsächlichen Fehler, darauf hinzuweisen, zum Beispiel:

BOOST_STATIC_ASSERT((std::is_same<T,U>)); 

Mit T=void* und U=char* mit gcc kompilierte produziert ~ 10 Fehlerzeilen, aber Sie können der entsprechend man leicht sehen:

error: no matching function for call to ‘assertion_failed(mpl_::failed************ std::is_same<void*, char*>::************)’