필자는 알고있는 것처럼 (전달) 선언으로는 달성 할 수없는 방식으로 상호 재귀 적 유형을 원합니다. 그러나 C++ 유명한 CRTP 또 다른 평균 제공 :
#include <map>
template <typename T>
struct BidirMapHelper {
struct ReverseElt {
ReverseElt() {}
ReverseElt(typename T::iterator p) : v(p) {}
typename T::iterator v;
};
typedef std::map<int, ReverseElt> ReverseMap;
};
struct BidirMap: BidirMapHelper<BidirMap>
{
struct DirectElt {
DirectElt() {}
DirectElt(ReverseMap::iterator p) : v(p) {}
ReverseMap::iterator v;
};
typedef std::map<int, DirectElt> DirectMap;
typedef DirectMap::iterator iterator;
};
typedef BidirMap::DirectMap DirectMap;
typedef BidirMap::ReverseMap ReverseMap;
int main() {
DirectMap m1;
ReverseMap m2;
m1[0] = m2.end();
m2[0] = m1.end();
return 0;
}
이 리눅스에서 g ++ 및 그 소리 ++로 깨끗하게 컴파일을,하지만 난 그것을 표준 라이브러리의 구현 특성에 의존하지 않는 모르겠어요 인정합니다 예를 들어 SCARY 반복자가 있습니다.
반드시 반복기 여야합니까? 그들은 단순히 값에 대한 포인터 일 수 있습니까? –
@RichardHodges : 포인터가 두 번째 문장에서 설명한 제약 조건을 충족시킬 수 있습니까? 더 많은 정보가 없으면 – Mehrdad
말할 수 없습니다. value_type에 대한 void 포인터는 키를 생성하기 위해 캐스팅 될 수 있지만 .... 나는 그것이 당신이 원하는 것이 아님을 안다. 아마도 우려를 나눌 시간이 되었습니까? 저장 및 색인 생성? –