Tipos simples com maior significado (C ++ 11)

Geralmente, encontro situações (no meu código C ++ / C ++ 11), em que tenho um tipo que basicamente se comporta como um tipo interno (ou um tipo "básico simples" comostd::string), mas isso tem um significado além de um número de 32 bits ou vários caracteres. Não encontrei nada útil na Internet, porque não tenho condições de pesquisar ...

Exemplos:

Certa vez, trabalhei em um sistema em que itens eram identificados por um ID. E esses IDs foramstd::strings (provavelmente não é a melhor ideia em primeiro lugar, mas essa é uma história diferente). O que foi realmente ruim, porém, foi o fato de que esses IDs foram transmitidos pelo sistema comostd::strings ou comoconst char*s. Portanto, era difícil (impossível) dizer onde os IDs da base de código foram usados ao procurar o tipo. Os nomes das variáveis eram todas variações de ID (ID, ID, ID) ou chave ou apenas i ou nome ou qualquer outra coisa. Portanto, você também não pode pesquisar pelo nome. Então, eu prefiro passar essas variáveis como tipoid_t.Portas de rede: sãouint16_ts. Mas eu gostaria de passá-los comonetwork_port_ts.

Geralmente, usei typedefs para tornar as coisas um pouco mais agradáveis. Essa abordagem tem vários problemas, porém:

Você não precisa usar o typedef. Você ainda pode transmitir variáveis pelo tipo "bruto" (por exemplo,std::string ao invés deid_t)Se o tipo bruto for um modelo, você terá que declarar o typedef (por exemplo, com um shared_ptr)."Declarar para frente" o typedef é um problema de manutenção. Se o tipo bruto mudar, você poderá mudar as coisas por todo o lugar.

Outra coisa que tentei com o exemplo de porta de rede foi escrever uma classe de invólucro fino com umaoperator uint16_t. Isso resolveu o problema com declarações avançadas. Mas então me deparei com uma armadilha com algumas macros de log que usavam printf internamente. O printfs ainda funcionava (bem, compilado), mas não imprimia o número da porta, mas (acho) o endereço do objeto.

Imaginei que dimensões como pesos ou comprimentos Boost.Units podem valer uma olhada (mesmo que pareça um pouco "pesada"). Mas para os dois exemplos acima, não se encaixa.

Qual é a melhor prática para alcançar o que eu quero (usar o Boost é uma opção)?

Em resumo: O que eu quero alcançar é passar "tipos com significado mais alto" como seu próprio tipo e não como o tipo simples bruto / de baixo nível / não-abstrato. (Tipo de) como ter um tipo definido pelo usuário. De preferência, sem a enorme sobrecarga de escrever uma classe completa para todos os tipos com implementações basicamente idênticas, apenas para poder fazer o que os built-ins já podem fazer.

questionAnswers(3)

yourAnswerToTheQuestion