palavra-chave "usando" em C++

Estou a aprender C++. E o meu professor usa um código que é algo como

using filePath = std::string;
using setOfPaths = std::set<filePath>;
using iterOfSet = setOfPaths::iterator;
using listOfIter = std::list<iterOfSet>;
using iterList = listOfIter::iterator;
using fileName = std::string;
using mapOfFileName = std::map<fileName, listOfIter>;
using iterOfMap = mapOfFileName::iterator;

setOfPaths _setOfPaths;
mapOfFileName _mapOfFileName;
iterOfSet setIter;

quero saber porque estamos a usar a palavra-chave using. Porque não podemos simplesmente escrever?

std::string filepath;

std::set<filepath> setOfPaths;
...
...
Qual é o benefício de ter a palavra-chave using?

Author: Radiodef, 2015-02-18

1 answers

A palavra-chave using é usada para definir os nomes alternativos do tipo. As razões pelas quais o seu professor está a usá-lo São:

  • legibilidade
  • sendo mais descritivo
  • evite o desnecessário typename

Legibilidade e carácter descritivo

Pode usar pseudónimos tipo para restringir semanticamente (e apenas isso) um tipo específico, tornando o nome mais descritivo para o uso específico.

Um exemplo é:

using fileName = std::string;

A alcunha fileName é usada para descrever uma cadeia de nomes de ficheiros, não uma cadeia qualquer. Isso faz com que as assinaturas de funções legíveis também.

Sinto que tenho de repetir isto, é apenas um nome falso. Qualquer função que tome fileName como argumento funcionará perfeitamente com qualquer argumento std::string.

Desnecessário typename

Alguns podem parecer desnecessários, como:
using setOfPaths = std::set<filePath>;

Mas em alguns casos eles podem ser realmente usados para evitar ter que especificar typename em situações como:

template<typename Type>
struct something {
    using something_iter = typename std::set<Type>::iterator;
};

Com:

template<typename Container>
using itertype = typename Container::iterator;

template<typename Type>
struct something {
    using something_iter = itertype<std::set<Type>>;
}; 
[21] movendo typename numa alcunha específica, podemos reutilizar itertype em várias outras ocasiões, evitando efectivamente typename.

Uma nota em typedef

Há outra maneira de definir os pseudónimos tipo: typedef. Essa palavra-chave é herdada de C e não permite pseudónimos templados, como:

template<typename Type>
using vec = std::vector<Type>;

Uma nota sobre a segurança do tipo

Isto não é mais seguro do que não usar pseudónimos. Mais uma vez, fileName e std::string são exactamente do mesmo tipo. Você pode usar ambos alternadamente.

Um passo seguinte possível seria definir um tipo específico fileName de classe/estrutura com os seus invariantes específicos.

 12
Author: Shoe, 2015-02-18 03:28:52