Chcę zadeklarować kilka rodzajów (wewnętrznych do klasy matrycy na K
i V
i zapewniając pewne zachowanie buforowania):Jak przełamać ten okrągły typedef?
typedef std::map<
long long,
typename key_to_value_type::iterator // Ooops... not declared yet
> timestamp_to_key_type;
typedef std::map<
K,
std::pair<V,typename timestamp_to_key_type::iterator>
> key_to_value_type;
Oczywiście nie jest to możliwe, jak jest, bo z definicji kołowej . Mogę to zhakować za pomocą void*
, ale zastanawiam się, czy jest jakaś magia do przekazywania zgłoszeń lub inna technika, która lepiej wykona zadanie.
(Tak, wiem, że boost::bimap
odsunąłby problem).
Czy próbujesz utworzyć mapę z danymi, a następnie indeks tej mapy w innej kolejności? (Przypuszczalnie dla szybkiego wyszukiwania) –
Pojawiło się pytanie, podczas gdy wygłupiałem się z jakimś działającym już kodem LRU-caching (w zasadzie mapą klucz-wartość uzupełnioną o śledzenie, więc najmniej używane ostatnio rekordy można oczyścić w razie potrzeby). Oryginalna wersja ma wartość każdej mapy, która zawiera typ klucza drugiej mapy, ale niektóre dostępy O (log n) mogą zostać zmiażdżone w celu bezpośredniego dostępu do iteratora za pomocą powyższego formularza. Ale nie chcę, aby to pytanie zmieniło się w debatę na temat zalet implementacji pamięci podręcznej LRU! To bardziej, że zdałem sobie sprawę, że nie wiem, jak najlepiej radzić sobie z tego rodzaju problemu typedef/forward-declaration. – timday
+1 To dobre pytanie. Gdybym tylko wiedział, jaki typ chcesz wyrazić. – wilhelmtell