단항 연산자를 오버로드하는 타당한 이유는 무엇입니까?
좋아, 나는 약간의 머리를 펀칭 하도록 영감을 받았다 . 과부하 operator&
로 인해 약간의 고통이 발생하지 않는 것 같습니다 .
과부하에 대한 합법적 인 사례는 무엇입니까?
(내가 해본 적이 없다 ....)
operator&
스마트 포인터 개체의 주소가 아닌 포함 된 포인터의 주소를 반환하기를 원했기 때문에 덮어 쓰는 스마트 포인터 클래스와 같은 것을 기억하는 것 같습니다 . 내가 어디에서 보았는지 또는 당시에 좋은 생각 이었는지 기억할 수 없습니다.
Aha, 기억 : Microsoft의 CComPtr .
편집 : 일반화하려면 다음 조건에서 의미 가있을 수 있습니다.
- 다른 물건으로 가장하는 물건이 있습니다.
- 이 객체는 가장 한 것으로 보이는 것에 대한 포인터를 얻을 수 있습니다.
합법적 인 포인터가 아닌 다른 것을 반환하는 것은 최소 경악 의 원칙을 위반하는 것입니다 .
단항 &
을 오버로딩 하면 객체 가 참조 처럼 동작합니다 .
내장 참조에 대한 대안을 제공하려는 시도는 어리석은 일이라고 확신합니다. 특히 참조는 C ++에서 전혀 객체가 아니며 자체 주소가 없기 때문입니다. 사용자 정의 유형의 인스턴스는 불가피하게 객체이며 해당 주소를 얻는 일반적인 방법을 비활성화하더라도 주소가 있습니다. 따라서 완벽한 모방이 아닙니다.
그러나 사람들은 포인터에 대한 사용자 정의 대안에 매우 열중하기 때문에 누군가가 어떻게 시도하고 싶어하는지 알 수 있습니다. 사용자가 귀찮게하지 않았 으면하는 방식으로 작동하는 유형을 만드는 것을 피할 수 있을지 모르겠습니다.
&
람다 자리 표시 자 표기법으로 연산을 나타낼 때 유용합니다 &_1[_2]
.
4 년 후, 또 다른 대답.
내가 본 또 다른 용도는 C ++ 언어를 피기 백하지만 자신 만의 의미를 정의 할 때입니다. 대표적인 예 : Boost.Spirit.
Boost.Spirit, 특히 파싱 용 Qi는 파서에 연산자를 오버로드하여 임의 파서 객체를 지정하기위한 EBNF와 유사한 구문을 제공합니다. 특히 단항 &
연산자는 And-Predicate Parser 를 제공하기 위해 오버로드됩니다 .
And-Predicate 파서 (& a)
기술
구문 술어는 다른 프로덕션을 평가하기 전에 충족되어야 할 특정 조건 구문을 주장합니다. 시맨틱 술어와 유사하게, eps, 구문 술어는 입력을 사용하지 않습니다. and-predicate, & a는 조건자가 일치하는 경우에만 길이가 0 인 일치를 반환하는 양의 구문 조건 자입니다.
사용 예 :
기본 미리보기 예 : 마지막 문자가 세미콜론인지 확인하되 사용하지 말고 다음 문자를 들여다 봅니다.
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
요컨대, &
여기서 단항 은 포인터와 전혀 관련이 없습니다. Qi 파서 객체에 적용되는 도메인 별 의미 체계가 있습니다.
LLVM 코드를 생성하는 DSL 컨텍스트에서 좋은 효과를 내기 위해이 작업을 수행했습니다. 예를 들어 설명합니다. 말 x
과 y
값 (즉, 유형의 객체이다 value
). 그런 다음 표현식 x+y
은 일부 코드 스트림으로 ADD 명령을 내 보냅니다. 상당히 현명하게 표현 &x
은 주소를 취하라는 명령을 내 보냅니다 x
.
스택에서 생성 된 객체에 대한 스마트 포인터가 가끔 생성되는 것을 방지하기 위해 연산자 & (동작을 변경하지 않고)를 클래스 전용으로 재정의했습니다. 정말 좋은 생각인지 아직 확실하지 않습니다 ...
주소 연산자를 오버로드하여 비공개로 만들 수 있습니다. 이것은 배턴의 주소를 가져올 수없는 일종의 배턴 통과 방식을 구현하는 데 유용 할 수 있습니다. 배턴의 생성자가 숨겨져 있으면 배턴의 범위를 밀폐 할 수 있습니다.
'IT Share you' 카테고리의 다른 글
Go HTTP 핸들러에서 ResponseWriter는 값이지만 Request는 포인터 인 이유는 무엇입니까? (0) | 2020.11.08 |
---|---|
PHPUnit에서 시간을 "모의"할 수 있습니까? (0) | 2020.11.08 |
setEnabled () 대 setClickable (), 차이점은 무엇입니까? (0) | 2020.11.08 |
여러 진입 점을 사용하여 babel polyfill을 포함하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.08 |
Java- 'this'키워드를 사용하는 경우 (0) | 2020.11.07 |