Eu vi as duas soluções, então é definitivamente dependente do contexto.
Por questões de legibilidade, ter várias estruturas, como você sugere, é muito eficaz. No entanto, em alguns ambientes, você deseja fazer manipulações comuns a essas estruturas e se encontra duplicando o código, como as operações matriciais vetoriais *. Pode ser frustrante quando a operação em particular não está disponível no seu tipo de vetor, porque ninguém a portou.
A solução extrema (a qual finalmente cedeu) é ter uma classe base modelada de CRTP com funções get < 0 > () obter < 1 > e obter < 2 >) para obter os elementos de uma maneira genérica . Essas funções são então definidas na estrutura cartesiana ou polar que deriva dessa classe base. Ele resolve todos os problemas, mas chega a um preço bastante tolo: ter que aprender a metaprogramação de modelos. No entanto, se a metaprogramação de modelos já é um jogo justo para o seu projeto, pode ser uma boa combinação.