Dev (Back & Front)ARTIGO

Strings literais puras no C++11

Agora que tenho um sistema funcional capaz de compilar tanto expressões regulares quanto strings literais puras, é hora de mostrar a você como simplificar mais ainda os exemplos tratados aqui.

Basicamente, uma string literal pura é um string na qual os caracteres de saída (como \n \t ou \”) do C++ não são processados. Uma string literal pura começa com R”( e termina em in)”, vamos ver em um in um exemplo da diferença entre uma string normal e uma string pura em C++:

#include <iostream>
#include <string>

using namespace std;

int main()
{
string normal_str="First line.\nSecond line.\nEnd of message.\n";
string raw_str=R"(First line.\nSecond line.\nEnd of message.\n)";
cout<<normal_str<<endl;
cout<<raw_str<<endl;
return(0);
}

normal_str será processado na hora da compilação, então você verá três linhas de texto e uma linha vazia. No caso da variável  raw_str, que é uma string literal, o compilador não irá processar os caracteres de saída, então você verá uma única linha de texto com um conteúdo idêntico àquele que você tem no código fonte do C++.

Se você compilar e executar o código acima, salvo em um arquivo chamado  “raw_string_00.cpp”, isto é o que você deve ver:

sol@sol:~$ clang++ -std=c++0x -stdlib=libc++ raw_string_00.cpp
sol@sol:~$ ./a.out
First line.
Second line.
End of message.

First line.\nSecond line.\nEnd of message.\n
sol@sol:~$

Se você não tiver clang-3.1 and libc++ na sua máquina, você também pode compilar o código acima com g++-4.6. Nesse caso, você usaria esta linha para compilar o código:

g++ -std=c++0x raw_string_00.cpp

A parte acima não pode ser compilada com o Visual Studio 2010, que não oferece suporte para strings literais puras, quando da escrita deste artigo.

Uma primeira aplicação do conceito de string pura é na simplificação da sintaxe das expressões regulares. O codificador pode colocar todo seu esforço em escrever uma expressão regular de acordo com o padrão ECMAScript e não em se certificar de que sua expressão regular será processada corretamente pelo compilador.

Pegue por exemplo a expressão regular usada neste artigo para verificar se o input do usuário era um número inteiro. Sem strings puras é assim que o código deve ser (e se você quiser usá-lo com o VS 2010, deve mantê-lo desta maneira):

regex integer("(\\+|-)?[[:digit:]]+");

Usando uma string pura, podemos simplificar a parte do código acima, podemos retirar os caracteres de saída:

string raw_pattern=R"((\+|-)?[[:digit:]]+)";
regex integer(raw_pattern);

ou uma versão mais condensada:

regex integer(R"((\+|-)?[[:digit:]]+)");

Um padrão para números correspondentes pode ser escrito desta maneira:

...
string input;
regex rr(R"(((\+|-)?[[:digit:]]+)(\.(([[:digit:]]+)?))?((e|E)((\+|-)?)[[:digit:]]+)?)");
cout<<"Give me a real number!"<<endl;
cin>>input;
if(regex_match(input,rr))
cout<<"float"<<endl;
else
{
cout<<"Invalid input"<<endl;
}
...

Para aqueles interessados em aprender a sintaxe do novo C++11, eu recomendo a leitura do Professional C++, de M. Gregoire, N. A. Solter e S. J. Kleper: 

Se você quiser aprender mais sobre expressões regulares, a melhor fonte no campo é o livro Mastering Regular Expressions, de Jeffrey E.F. Friedl:

?

Texto original disponível em http://solarianprogrammer.com/2011/10/16/cpp-11-raw-strings-literals-tutorial/

Matérias especiais e reportagens conduzidas internamente pela Redação iMasters. Acompanhe no Twitter @imasters e no Instagram/Threads @portalimasters

Ver perfil