Einfache Typen mit höherer Bedeutung (C ++ 11)

Ich stoße oft auf Situationen (in meinem C ++ / C ++ 11-Code), in denen ich einen Typ habe, der sich grundsätzlich wie ein eingebauter Typ verhält (oder ein "einfacher" Typ wiestd::string), aber das hat eine Bedeutung, die über eine 32-Bit-Zahl oder eine Reihe von Zeichen hinausgeht. Ich habe im Internet nichts Nützliches gefunden, weil ich nicht wirklich weiß, nach welchen Begriffen ich suchen soll ...

Beispiele:

Ich habe einmal an einem System gearbeitet, bei dem Artikel durch eine ID identifiziert wurden. Und diese IDs warenstd::strings (wahrscheinlich nicht die beste Idee, aber das ist eine andere Geschichte). Was aber wirklich schlimm war, war die Tatsache, dass diese IDs als @ durch das System geleitet wurdestd::strings oder alsconst char*s. Daher war es schwierig (unmöglich) zu sagen, wo in der Codebasis IDs bei der Suche nach dem Typ verwendet wurden. Die Variablennamen waren alle Variationen von ID (ID, ID, ID) oder Schlüssel oder nur i oder name oder was auch immer. Sie konnten also auch nicht nach Namen suchen. Daher würde ich diese Variablen lieber als Typ @ übergebeid_t.Network Ports: Sie sinduint16_ts. Aber ich würde sie gerne als @ übergebnetwork_port_t s.

Ich habe im Allgemeinen typedefs verwendet, um die Dinge ein bisschen schöner zu machen. Dieser Ansatz hat jedoch mehrere Probleme:

Sie müssen den Typedef nicht verwenden. Sie können weiterhin Variablen vom Typ "raw" übergeben (z. B.std::string Anstatt vonid_t).Wenn der rohe Typ eine Vorlage ist, ist die Deklaration der typedef (z. B. mit einem shared_ptr) abgeschlossen. "Vorwärts deklarieren" die typedef ist ein Wartungsproblem. Wenn sich der rohe Typ ändert, können Sie überall Dinge ändern.

Eine andere Sache, die ich mit dem Netzwerkport-Beispiel ausprobiert habe, war das Schreiben einer Klasse mit dünnem Wrapper und einemoperator uint16_t. Dies löste das Problem mit Vorwärtserklärungen. Aber dann bin ich auf eine Falle mit einigen Protokollierungsmakros gestoßen, die printf intern verwendeten. Die printfs funktionierten immer noch (gut, kompiliert), druckten aber nicht die Portnummer, sondern (glaube ich) die Adresse des Objekts.

Ich habe es mit Maßen wie Gewichten oder Längen berechnet. Boost.Units könnten einen Blick wert sein (auch wenn es ein wenig "schwer" erscheint). Aber für die beiden obigen Beispiele passt es nicht.

Was ist die beste Vorgehensweise, um das zu erreichen, was ich möchte (Boost ist eine Option)?

Zusamenfassend Was ich erreichen möchte, ist, "Typen mit höherer Bedeutung" als eigenen Typ zu übergeben und nicht als einfachen rohen / niedrigen / nicht abstrakten Typ. (Art von) wie mit einem benutzerdefinierten Typ. Am besten ohne den großen Aufwand, eine komplette Klasse für jeden Typ mit im Grunde identischen Implementierungen zu schreiben, nur um das tun zu können, was bereits eingebaute Funktionen können.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage