https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
Idioms라는 용어가 생소하다. 한국어로 하면 관용구인데, 개발 용어로는 그냥 관용구라고 생각하면 안될 것 같아서 서문을 살짝 읽어봤다.
Idiom라는 것은 C++를 사용하여 프로그래밍하거나 설계할 때 자주 사용하게 되는, 재사용 가능한 패턴이나 팁이다. 특정 상황에서 쓰이는, 특정 상황에 대처하기 위한 일반적인 관행이라는 뜻이다.
이 목록은 이런 관용구들을 모아둔 리스트이다. 이 관용구들을 이해함으로써 다른 사람의 코드가 왜 그렇게 짜였는지 읽기 쉬워지고, 언어가 어떤 특성을 가져서 어떻게 짜면 좋은지 등등을 이해할 수가 있다.
이 목록들은 각각 Idiom의 Intent, Also Known As(Alias), Motivation, Solution and Sample Code, Known Uses, Related Idioms, References를 설명한다. 양식이 그렇게 되어있다. 나도 맞춰서 정리하겠다.
동아리 세미나 과제인데, 빨갛게 안 만들어진 페이지빼고 공부한다.
&연산자를 재정의해서 사용하는 클래스(그래서 &로 주소 리턴하는 연산 못하는 경우)의 객체 주소 주소를 찾기 위한 기능
C++는 클래스 내부에서 &를 재정의 할 수 있다. 보통 & 연산자를 주소를 리턴하게 되는데, 이걸 덮어씌워서 다른 작동을 하게 할 수가 있다. 그러고보니 수업에서 교수님이 연산자를 재정의할 수 있는데, 좀 복잡하다 뭐 이런 이야기를 했던 기억이 난다. 굳이 그걸 왜 재정의하는지 위키에서도 이해하기 힘들다고 하지만, 어쨌든 가능하다. 그래서 Address-of idioms로 객체의 & 재정의 여부와 관계없이, 그러니까 &없이 실제 주소를 찾아 대처하기 위해 주로 쓰는 방법이 있다.
class nonaddressable
{
public:
typedef double useless_type;
private:
useless_type operator&() const;
};
int main()
{
nonaddressable na;
nonaddressable * naptr = &na; // Compiler error here.
}
아래 예시가 있다. na라는 nonaddressable 클래스 객체의 주소를 &연산자로 받으려는 코드인데, nonaddressable 클래스가 &를 private으로 재정의 해놔서 쓸 수가 없다. 컴파일 에러가 난다.
template <class T>
T *addressof(T &v)
{
return reinterpret_cast<T *>(& const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}
int main()
{
nonaddressable na;
nonaddressable * naptr = addressof(na); // No more compiler error.
}
Address-of 객체의 주소를 연속적으로 캐스팅 하는 것이다. 컴파일 에러없이 돌아간다.
C++11 표준인 header에 이 문제를 해결하기 위해 addressof 함수가 포함되어있다.
Boost(c++ 라이브러리)의 addressof 기능
없음
C++11 표준에서의 addressof util 관련 문서
https://en.cppreference.com/w/cpp/memory/addressof
boost 라이브러리의 addressof util 관련 문서
https://www.boost.org/doc/libs/1_47_0/libs/utility/utility.htm#addressof
+아니 C++ 태그 달면 C로 달리네...