De ce să folosim std::type_index în loc de std::type_info* (Programare, C++, C++11, Rtti)

Drew Noakes a intrebat.

Trebuie să introduc niște date într-o hartă în funcție de un tip. În prezent, am ceva de genul acesta:

struct TypeInfoComparer
{
  bool operator()(std::type_info const* a, std::type_info const* b) const
  {
    return a->before(*b);
  };
};

std::map<std::type_info const*, Foo, TypeInfoComparer> d_fooByTypeId;

Pe care apoi îl pot căuta din folosind (de exemplu, într-o metodă de șablon având <typename T>:

auto pair = d_fooByTypeId.find(&typeid(T));

Cu toate acestea, astăzi am citit despre std::type_index care pare să fie destinat utilizării într-un astfel de caz ca acesta.

Sunt interesat să îmi îmbunătățesc cunoștințele despre C++. Poate cineva să îmi explice dacă ar trebui să îmi modific codul pentru a utiliza std::type_index, , și de ce? Există vreun motiv în afară de posibilitatea de a putea înlătura TypeInfoComparer?

Comentarii

  • De ce credeți că type_info returnat de typeid este persistent și unic pentru un anumit tip? –  > Por Yakk – Adam Nevraumont.
  • @Yakk: „Rezultatul unei expresii typeid este o lvaloare de tip static const std::type_info… Durata de viață a obiectului la care se face referire prin lvalue se extinde până la sfârșitul programului.” ([expr.typeid]). El nu presupune că este unic; el folosește standardul before standard în comparatorul său. Nu știu de ce tuturor le scapă acest fapt. –  > Por rici.
2 răspunsuri
rici

type_index este „un înveliș simplu pentru type_info care poate fi utilizat ca tip de index în containere asociative (23.4) și în containere asociative neordonate (23.5)”. Dacă utilizați type_index în loc de type_info*, , veți scăpa de necesitatea de a furniza un comparator explicit în hărțile dumneavoastră. Singurul cost este acela că trebuie să #include <typeindex>.

Un alt beneficiu este că vă va permite să treceți la (sau să folosiți, de asemenea,) hashmaps (aka unordered_maps).

În general, din moment ce vă simplifică codul, aș spune „mergeți pe ea”.

Comentarii

  • și nu există prea multe motive pentru a utiliza un map ca before ordinea este arbitrară. –  > Por Yakk – Adam Nevraumont.
Dietmar Kühl

Nu cred că utilizarea unui pointer către rezultatul returnat de la typeid(x) este garantat că va produce întotdeauna același rezultat. În special, pare problematică garantarea returnării aceluiași obiect atunci când sunt utilizate biblioteci partajate. Utilizarea prevăzută a std::type_info pentru sortare este de a utiliza before() membru. Clasa std::type_index înglobează acest lucru într-o interfață simoler.

Comentarii

  • „Nu cred că utilizarea unui pointer la rezultatul returnat de typeid(x) este garantată pentru a produce întotdeauna același rezultat”… Ei bine, este garantat, conform specificațiilor, să returneze rezultatul același obiect de fiecare dată când folosiți typeid(x). –  > Por Nawaz.
  • @Nawaz „Nu există nicio garanție că aceeași instanță std::type_info va fi menționată de toate evaluările expresiei typeid pe același tip […]” ro.cppreference.com/w/cpp/language/typeid la rubrica „note” –  > Por phön.
  • @phön: Aveți dreptate și comentariul meu anterior s-a dovedit a fi greșit. Cu toate acestea, păstrez intact comentariul meu anterior (incorect) pentru ca alții să nu facă aceeași greșeală. –  > Por Nawaz.

Tags:, ,