2016-09-05 2 views
2

이 질문은 이전 글 : Why shouldn't C++ operator new/delete/variants be in header files?에서 따 왔습니다. 신속하게 요약하기 위해 나는 전역 연산자 new, delete 등을 오버라이드하는 것에 대해 배우고 있습니다. 이제는 사용자 정의 할당 자 클래스 (내 오버로드 된 연산자 new std::set::insert(...), 즉 new, 따라서 무한 재귀 호출)가 필요합니다. 내가 std::set에 (예를 들어, new 대신에 malloc를 사용하는) 사용자 지정 할당기를 제공한다고 생각하면 무한 재귀를 무시할 수 있습니다.struct rebind :: other는 무엇을 의미합니까?

커스텀 할당자를 구현하는 방법에 대해 약간의 글을 읽었으며, 의미가 struct rebind 인 것으로 약간 혼란 스럽습니다.

여기에 좋은 Q & A가 있습니다 : Parsing allocator::rebind calls하지만 여전히 특정 항목 하나가 혼란 스럽습니다. cplusplus.com는 struct rebind에 대해 말한다 :

멤버 유형 다른 내가 otherstruct rebind의 구성원 인 방법을 이해하지 않는 유형 유형

의 요소를 할당 할 해당 할당 유형입니다. 내가 otherstruct rebind의 멤버 변수가 얼마나

template <class Type> struct rebind { 
    typedef allocator<Type> other; 
}; 

볼 수 없습니다 : 정의는 struct rebind을 위해 내가 좋아하는 모습을 발견했습니다. 단지 typedef 에드입니다. 전역 네임 스페이스에서 typedef int foo;을 수행했다면 글로벌 네임 스페이스에 선언 된 int 유형의 전역 변수가 있다는 의미가 아니므로 otherstruct rebind의 멤버가됩니까?

덧붙여서, 나는 이것이 적어도 C++ 11 이후의 모든 단순화 된 것을 알고있다. (적어도 나는 이것을 읽었다.) 그러나 나는이 기본적인 것을 이해하기 위해 이것을 먼저 이해하고 싶다. 어떤 도움을 주셔서 감사합니다.

이 항목에서 구조체 내에서 typedef 처리 문제를 설명 할 수 있습니까? 나는 응답자 요하네스 샤 우브 (Johannes Schaub)의이 amazing example에 한번 전에 그것을 보았습니다. 그러나 나는 아직 완전히 그것을 알아 채지 못했습니다. 내게는 typedef의 범위를 포함하는 struct의 인스턴스 내로 제한하는 것처럼 보입니다.

UPDATE : 내 질문에이를 추가 할

. cppreference.com에서이 축소 된 예를 사용 :

#include <memory> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::allocator<int> a1; // default allocator for ints 

    decltype(a1)::rebind<std::string>::other a2_1; 
} 

라인 decltype(a1)::rebind<std::string>::other a2_1;std::allocator<std::string> a2_1; 말의 긴 방법이 아니다?

+0

'struct '내에'typedef'를 쓰면 주어진 템플릿을 기반으로 타입을 선택할 수 있습니다. 그게 다야. 특별한 일을하기 위해 전문화되어있을 수도 있지만 그게 전부입니다. 그러나, make_integer_sequence에 대한 구현은 여러분에게 필요한 것을 제공하기 위해 멋진 재귀를 사용합니다. – AndyG

답변

4

기타가 구성원 변수 struct rebind과 어떻게 다른지 알 수 없습니다.

아니야.

그냥 typedef입니다.

맞아요.견적과 마찬가지로 유형 회원입니다.

이 항목에서는 구조체 내에서 typedefing에 대한 설명도 할 수 있습니까? 응답자 요하네스 샤 우브 (Johannes Schaub)의이 놀라운 예에서 한번 봤습니다. 그러나 나는 아직 완전히 그것을 알아 채지 못했습니다.

그것은 단순히 (당신이 litb의 예에 대해 이해하지 못하는 당신이 언급하지 않은 것처럼) 동일한 문제가되지 않습니다 예를 제공하기 어렵지만, 여기에 우리가 간다 :

struct Foo 
{ 
    typedef int bar; 
}; 

Foo::bar x = 42; // creates an int named `x`, because Foo::bar is int 

내게는 typedef의 범위를 포함하는 구조체의 인스턴스 내로 제한하는 것처럼 보입니다.

맞아요. 결과 타입은 중첩 클래스가 될 것처럼 클래스의 멤버이며 클래스가 그 둘러싸는 네임 스페이스의 멤버와 같습니다. 그런데

, 내가 아는이 11

아니, 멤버 유형은 기본적으로 모든 버전에서 변경되지 않은 ++ 모든되고 단순화 된 후 C를 가지고 (또는 적어도 나는 읽었습니다) 언어 (새 using 구문을 사용하면 더 쉽게 선언 할 수 있음).

I 글로벌 네임 스페이스에 typedef int foo;을 한 경우, 의미하지 않는다 전역 네임 스페이스

아니, 선언 형 int의 전역 변수가 foo라는 유형있을 것있다 전역 네임 스페이스에서.

decltype(a1)::rebind<std::string>::other a2_1;은 먼 길을 말하지 않고 std::allocator<std::string> a2_1;입니까?

예; 먼 길, 그리고 a1이 무엇이든 관계없이 작동하는 방법 (따라서 결과는 std::allocator<T>이 아닐 수 있습니다). 그것은 템플릿을 작성할 때 중요합니다.

+0

매력적인. 다시 한번 감사드립니다 @ LightnessRacesInOrbit (전 당신이 저에게서 다른 질문에 답한 것 같습니다). 구성원 _ 변수 _와는 대조적으로 구성원 _types_의 개념은 새로운 것입니다. 당신의 대답은 내가 사진을 찍는 것을 돕고 있습니다. 내가 스스로를 최고의 C++ 프로그래머라고 생각한 것은 아니지만 나는 (순진하게) 내가 그 언어에 익숙하다고 생각했다. 그런 참신함이 발견되어 얼마나 재미 있었는지. – StoneThrow

+1

@StoneThrow : Oh so many :) 그리고 대부분은 전혀 웃겨 없습니다. –

+0

@StoneThrow : 멤버 유형은 C++ 표준 라이브러리 전체에서 사용됩니다. 예를 들어'std :: vector :: iterator'를보십시오. http://en.cppreference.com/w/cpp/container/vector – Jesin

관련 문제