Що означає P :: ************ у файлі Boost assert.hpp?


80

У boost / mpl / assert.hpp я побачив щось подібне:

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;
};

Якщо перше ************можна розглядати як вказівники на структуру, що не вдалося, P::************для мене це насправді не має ніякого сенсу. Це стандартний C ++?


38
Поінтерцепт ...
Якуб Арнольд

5
@deviantfan У виробничому коді? Ви були б здивовані. ;) Але справа тут у тому, щоб спричинити помилку компіляції, намагаючись посилатися на члена Pз дуже високою ступенем впевненості, що він не буде існувати. (У C ++ 11 ви б, напевно, просто використовували static_assert(false)замість цього, але, звичайно, Boost повинен бути переносним до попереднього C ++ 11.)
cdhowie

4
Примітка: 12-рівневий покажчик, ймовірно, має щось спільне з мінімумом, який вимагає стандарт C.
TC

29
@PaulDraper насправді він hunter2hunter2hunter2hunter2тут читає
sehe

5
вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на вказівник на члена типу P
Кай

Відповіді:


100

Суть цього коду - допомогти компілятору видавати "видимі" повідомлення про помилки.

У попередні static_assertчаси компіляція важкого для шаблону коду може легко створити ~ 100 рядків повідомлень про помилки навіть для однієї помилки, і 99% цих рядків часто не мають сенсу.

Трюк з 10 покажчиків корисний, щоб вказати на фактичну помилку, наприклад:

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

Завдяки gcc T=void*і U=char*компіляції видає ~ 10 рядків помилок, але ви можете легко побачити відповідний:

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

45

Це вказівник на вказівник на -...- член типу P, де членом є член даних типу pointer-to-pointer-to -...- failed.

У цьому випадку мета полягає лише в тому, щоб звести компіляцію, не вдавшись, посилаючись на члена Pз дуже високим ступенем ймовірності, що його не буде. У C ++ 11 ви б просто використовували static_assertзамість цього, але, звичайно, Boost повинен бути портативним для діалектів до C ++ 11.


19

F P::*є "вказівником на член Pтипу F".

F P::**є "вказівником на вказівник на член Pтипу F".

More *s додає більше "покажчика на" попереду.

У цьому випадку Fє failed ************, тобто, "вказівник на вказівник на ... вказівник на failed".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.