在 Boost assert.hpp 文件中 P: : * * * * * * * * 是什么意思?

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

如果第一个 ************可以被视为 struct 的指针失败,那么 P::************对我来说真的没有任何意义。这是标准的 C + + 吗?

4376 次浏览

它是 P类型的指针指向...-成员,其中该成员是指针指向...-failed类型的数据成员。

在这种情况下,目标仅仅是通过引用 P的某个成员来导致编译失败,而这个成员很可能不存在。在 C + + 11中,你只需要使用 static_assert代替,但是当然 Boost 需要可移植到 C + + 11之前的方言中。

F P::*是一个“指向类型为 FP成员的指针”。

F P::**是一个“指向 F类型的 P成员的指针”。

更多的 *在前面添加更多的“指针”。

在本例中,Ffailed ************,即“指向指向... 指向 failed的指针”。

此代码的目的是帮助编译器生成“可见”错误消息。

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*>::************)’