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는 앞에 더 많은 "포인터"를 추가합니다.
이 경우, F
is failed ************
, 즉 "포인터에 대한 포인터 ... 포인터에 대한 failed
".
참고 URL : https://stackoverflow.com/questions/27025929/what-does-p-mean-in-boost-assert-hpp-file
'development' 카테고리의 다른 글
ARC의 NSString에서 CFStringRef로, CFStringRef에서 NSString으로? (0) | 2020.10.07 |
---|---|
너비가 각각 50 % 인 두 개의 인라인 블록 요소가 한 행에 나란히 맞지 않습니다. (0) | 2020.10.07 |
numpy 배열에서 행 삭제 (0) | 2020.10.07 |
페이지의 아무 곳에서나 누른 Enter 키 캡처 (0) | 2020.10.07 |
하나의 테두리에만 윤곽선 (0) | 2020.10.07 |