palavra-chave "usando" em C++
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
?
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.
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.