development

Boost assert.hpp 파일에서 P :: ************는 무엇을 의미합니까?

big-blog 2020. 10. 7. 07:52
반응형

Boost assert.hpp 파일에서 P :: ************는 무엇을 의미합니까?


부스트 / 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 ++입니까?


이 코드의 요점은 컴파일러가 "보이는"오류 메시지를 생성하도록 돕는 것입니다.

이전 static_assert시대에는 템플릿이 많은 코드를 컴파일하면 한 번의 실수로도 ~ 100 줄의 오류 메시지를 쉽게 생성 할 수 있었으며 이러한 줄의 99 %는 종종 무의미했습니다.

10 개의 포인터 트릭은 실제 오류를 지적하는 데 유용합니다. 예를 들면 다음과 같습니다.

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

with T=void*U=char*gcc로 컴파일하면 ~ 10 개의 오류 줄이 생성되지만 관련 줄은 쉽게 볼 수 있습니다.

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

포인터 대 포인터 대 ...- 멤버 유형 P의 멤버이며, 여기서 멤버는 포인터 대 포인터 대 ...- 유형의 데이터 멤버입니다 failed.

이 경우 목표는 P존재하지 않을 가능성이 매우 높은 의 멤버를 참조하여 컴파일이 실패하도록하는 것입니다. C ++ 11에서는 static_assert대신 사용 하지만 물론 Boost는 C ++ 11 이전 방언으로 이식 할 수 있어야합니다.


F P::*"" P유형의 멤버에 대한 포인터 F입니다.

F P::**" P유형의 멤버에 대한 포인터에 대한 포인터 F"입니다.

더 많은 *s는 앞에 더 많은 "포인터"를 추가합니다.

이 경우, Fis failed ************, 즉 "포인터에 대한 포인터 ... 포인터에 대한 failed".

참고 URL : https://stackoverflow.com/questions/27025929/what-does-p-mean-in-boost-assert-hpp-file

반응형