Boostassert.hppファイルでP :: ************はどういう意味ですか?


80

ブースト/ 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
Pointerception ...
Jakub Arnold

5
@deviantfan本番コードでは?あなたは驚かれることでしょう。;)しかし、ここでのポイントは、のメンバーをP非常に高い確実性で参照しようとして、コンパイルの失敗を引き起こすことです。(C ++ 11static_assert(false)では、おそらく代わりに使用するでしょうが、もちろんBoostはC ++ 11より前の
バージョンに

4
補足:12レベルのポインターは、おそらくC標準で要求される最小値と関係があります。
TC

29
@PaulDraper実際にhunter2hunter2hunter2hunter2ここで読んでいます
sehe 2014年

5
タイプPのメンバーへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインターへのポインター
Kai

回答:


100

このコードのポイントは、コンパイラが「目に見える」エラーメッセージを生成するのを助けることです。

前に static_assert、テンプレートを多用するコードをコンパイルすると、1回のミスでも、簡単に最大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は、タイプのポインタからポインタへのメンバーです。ここで、メンバーは、ポインタからポインタへのタイプのデータメンバーですfailed

この場合の目標は、P存在しない可能性が非常に高いメンバーを参照することにより、コンパイルを失敗させることです。C ++ 11static_assertでは代わりに使用するだけですが、もちろんBoostはC ++ 11より前の方言に移植可能である必要があります。


19

F P::*PタイプのメンバーへのポインタF」です。

F P::**PタイプのメンバーへのポインタへのポインタF」です。

もっと *sが前に「へのポインタ」の詳細を追加します。

この場合、Ffailed ************、つまり、「へのポインタへのポインタ...へのポインタfailed」です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.