Os udls incluídos na biblioteca c ++ padrão
Mesmo que você pode atualmente criar literais (User-Defined UDLs) para alguns tipos básicos, há muitas situações em que os desenvolvedores precisam UDLs para aulas também. Em alguns casos, essas classes são parte da biblioteca padrão. Há agora UDLs consistentes e padronizadas ligados a algumas classes. A seguir estão algumas das classes mais importantes e como usá-los.
Conteúdo
std :: basic_string
o std :: basic_string classe torna possível trabalhar com sequências de Caracteres-como objetos. A classe atualmente tem modelos definidos para
Caracteres
wchar_t
char16_t
char32_t
No entanto, a classe poderia facilmente ser estendido para outros tipos de caracteres. Além disso, os modelos permitem especificar traços de caráter e o método utilizado para armazenar os dados na memória. A idéia básica por trás do basic_string é torná-lo possível para acomodar uma variedade de tipos de caracteres dentro de uma classe de personagem para simplificar a codificação.
Em C ++ 14, a Biblioteca padrão inclui suporte incorporado para literal basic_string. Tudo que você precisa fazer é adicionar o s sufixo a uma corda para criar uma. No entanto, é importante ter uma idéia de como tudo isso funciona nos bastidores. o BasicString exemplo demonstra três técnicas para a criação de um basic_string objeto.
#incluir#incluir using namespace operador std-string" _s (* str const char, unsigned len) {string return {str, len} -} int main () {basic_string StdString = "Esta é uma cadeia de caracteres padrão."-auto AutoString = "Esta é uma seqüência de auto."_s - // Remover comentário quando seu compilador suporta C ++ 14.//auto UDLString = "Esta é uma string UDL."s-cout lt; lt; StdString lt; lt; endl lt; lt; typeid (StdString) .nome () lt; lt; endl-cout lt; lt; AutoString lt; lt; endl lt; lt; typeid (AutoString) .nome () lt; lt; endl - // Remover comentário quando seu compilador suporta C ++ 14.//cout lt; lt; UDLString lt; lt; endl lt; lt; typeid (UDLString) .nome () lt; lt; endl-retorno 0-}
Este exemplo executa três níveis essenciais de conversão para que você possa ver a progressão de um para outro. No primeiro caso, você vê o método simples para a criação de um simples basic_string objeto, StdString.
Como você pode ver, ele funciona exatamente como qualquer outro modelo. O segundo caso depende de uma definição C ++ 11 tipo de operador para emular o UDL que está incluído como parte do C ++ 14. Tudo o que você realmente precisa saber agora é que o operador faz com que seja possível usar um atalho ao criar básico_corda objetos.
O terceiro caso mostra a versão C ++ 14 da mesma _s definição, mas este é construído a partir da Biblioteca Padrão para que você não tem que fazer nada especial para usá-lo. Em todos os três casos, você criar o mesmo basic_string objeto tipo, mas a técnica é diferente de cada vez. Quando você executar esse exemplo, você vê o seguinte resultado:
Esta é uma string.SsThis padrão é um auto string.SsThis é um UDL string.Ss
Este resultado mostra a forma do mutilado nome() saída de função. O fato de que todos os três cordas são o mesmo lhe diz que eles são o mesmo tipo de objeto. Se você quiser ver os nomes unmangled, você pode usar o Demangle () função fornecida.
std :: complex
Você pode ou não pode se lembrar de números complexos da escola. UMA número complexo consiste de um número real e um número imaginário que são colocados juntos. Real-mundo usa para números complexos incluem:
Video: Video aula biblioteca C - parte 1
Engenharia elétrica
dinâmica de fluidos
Mecânica quântica
computação gráfica
sistemas dinâmicos
Existem outros usos para números complexos, também, mas esta lista deve dar-lhe algumas ideias. Em geral, se você não está envolvido em qualquer uma dessas disciplinas, você provavelmente nunca vai encontrar números complexos. No entanto, a biblioteca padrão fornece suporte completo para números complexos, apenas no caso de você precisar deles.
Tal como acontece com o BasicString exemplo, este exemplo mostra a progressão de uma declaração padrão para o sufixo C ++ 14. o Número complexo exemplo demonstra todas as três etapas para que você possa ver como tanto o C ++ 14 sufixo eo C ++ 11 UDL formas de trabalho.
#incluir#incluir using namespace std-complexo operador" _i (Valor dupla de comprimento) {complexo de retorno (0, Value) -} int main () {complexo StdComplex (0, 3,14) -auto AutoComplex = 3.14_i - // Remover comentário quando seu compilador suporta C ++ 14.//auto UDLComplex = 3.14i-cout lt; lt; StdComplex.real () lt; lt; " " lt; lt; StdComplex.imag () lt; lt; endl-cout lt; lt; AutoComplex.real () lt; lt; " " lt; lt; AutoComplex.imag () lt; lt; endl - // Remover comentário quando seu compilador suporta C ++ 14.//cout lt; lt; UDLComplex.real () lt; lt; " " lt; lt; UDLComplex.imag () lt; lt; endl-retorno 0-}
O exemplo declara variáveis de todos os três tipos e atribui valores a elas. Em seguida, exibe ambas as partes real e imaginária do número. Quando você executar esse exemplo, você vê o seguinte resultado:
0 3,140 3,140 3,14
Você pode criar três tipos de números complexos. A lista que se segue mostra os sufixos usados para cada tipo:
Eu: Duplo
E se: flutuador
il: long double
std :: crono :: duração
o crono :: duração classe serve para marcar a passagem do tempo. Ele responde à pergunta de quanto tempo decorrido entre dois eventos. Os desenvolvedores usá-lo para todos os tipos de fins relacionados com o tempo.
UMA crono :: duração objecto depende de um segundo, como a duração do padrão entre os carrapatos. UMA Carraça é um único intervalo de tempo de duração. Usando a configuração padrão, cada instante é igual a um segundo. No entanto, você pode usar o proporção opor-se a definir uma nova duração da carraça. Por exemplo, se você definir ratiolt; 60gt; cada tique dura um minuto. Do mesmo modo, a definição ratiolt; 1, 5gt; define cada carrapato para durar um quinto de segundo.
Também é possível alterar um intervalo para outro usando duration_cast ou com um intervalo de padrão, tal como crono :: segundos, ou qualquer intervalo typedef que você deseja criar. Por exemplo, typedef chrono :: durationgt; fifths- define um intervalo chamado quintos.
Há muito mais para falar com o crono :: duração classe, mas agora você tem informações suficientes para trabalhar com o Duração exemplo mostrado. Tal como com os exemplos anteriores, este mostra uma progressão de definir uma variável directamente, ao uso de um UDL personalizado, e, finalmente, o suporte integrado que fornece C ++ 14.
#incluir#incluir using namespace std-crono :: duração operador" _m (valor longo longo não assinado) {return crono :: duração<60>gt; (Value) -} int main () {// Definir um intervalo de 20 minutes.chrono :: duração60><60>gt; StdTime (20) -auto AutoTime (20_m) - // Remover comentário quando seu compilador suporta C ++ 14.//auto UDLTime (20min) - // Output o tempo em seconds.cout lt; lt; crono :: duration_cast (StdTime) .count () lt; lt; endl-cout lt; lt; crono :: duration_cast (AutoTime) .count () lt; lt; endl - // Remover comentário quando seu compilador suporta C ++ 14.//cout lt; lt; crono :: duration_cast (UDLTime) .count () // lt; lt; endl-retorno 0-}60>
O exemplo demonstra algumas características do crono :: duração classe. No entanto, centra-se de novo sobre a progressão de definir a variável com a mão para utilizar um atalho para executar a tarefa. Note-se que a UDL depende de um valor inteiro, neste caso, em vez de um tipo de ponto flutuante. O valor de 20 minutos, é convertido em segundos para a saída. Como resultado, você vê esses valores quando você executar o aplicativo:
120012001200
A biblioteca padrão suporta um número de sufixos para crono :: duração quando você usa C ++ 14. A lista a seguir mostra os sufixos individuais e diz-lhe o que eles significam:
h: horas
min: Minutos
s: segundos
Senhora: milissegundos
nos: microssegundos
ns: nanossegundos