Os UDLs incluído na biblioteca padrão C ++

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 as classes 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.

std :: basic_string

o std :: basic_string classe faz com que seja possível trabalhar com sequências de carbonizar-como objetos. A classe tem atualmente modelos definidos para

  • carbonizar

  • wchar_t

  • char16_t

  • char32_t

No entanto, a classe pode facilmente ser estendida para outros tipos de caracteres. Além disso, os modelos de torná-lo possível especificar traços de carácter e o método utilizado para armazenar os dados na memória. A ideia essencial por trás da 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 embutido para literal basic_string. Tudo que você precisa fazer é adicionar o s sufixo para uma cadeia 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 usando operador namespace std-string "" _s (const char * str, sem assinatura len) {string de retorno {str, len} -} int main () {basic_string StdString = "Esta é uma cadeia de caracteres padrão." - Auto AutoString = ". Esta é uma cadeia 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) .name () lt; lt; endl-cout lt; lt; AutoString lt; lt; endl lt; lt; typeid (AutoString) .name () lt; lt; endl - // Remover comentário quando seu compilador suporta C ++ 14.//cout lt; lt; UDLString lt; lt; endl lt; lt; typeid (UDLString) .name () 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 direto 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 a 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 objectos.

O terceiro caso mostra a versão do C ++ 14 do mesmo _s definição, mas este é construído para a direita na 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 tipo de objeto, mas a técnica é diferente a cada vez. Quando você executar este 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 mutilada do nome() saída da 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:

  • Engenharia elétrica

  • dinâmica de fluidos

  • Mecânica quântica

  • computação gráfica

  • sistemas dinâmicos

Há 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 usando namespace std-complexo operador "" _i (Valor dupla de comprimento) {return complexo(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 eles. Em seguida, exibe ambas as partes real e imaginária do número. Quando você executar este exemplo, você vê o seguinte resultado:

0 3,140 3,140 3,14

É possível criar três tipos de números complexos. A lista a seguir 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. Developers usá-lo para todos os tipos de fins relacionados com o tempo.

UMA crono :: duração objeto depende de uma segunda como a duração padrão entre os carrapatos. UMA carrapato é um único intervalo de tempo de duração. Utilizando a configuração padrão, cada instante é igual a um segundo. No entanto, você pode usar o relação opor-se a definir uma nova duração do carrapato. Por exemplo, se você definir ratiolt; 60> cada tique dura um minuto. Do mesmo modo, a definição ratiolt; 1, 5> 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 :: duração> 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 acontece com exemplos anteriores, este mostra uma progressão de definir uma variável diretamente, ao uso de um UDL costume, e, finalmente, o apoio interno que C ++ 14 fornece.

#incluir #incluir usando namespace std-crono :: duração operador "" _m (sem assinatura valor longo tempo) {return crono :: duração<60>> (Value) -} int main () {// Define um intervalo de 20 minutes.chrono :: duração<60>> 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-}

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

menu