Usando Boost Tokenizer escaped_list_separator con diferentes parámetros
Pregunta
Hola i estado tratando de conseguir un señalizador para trabajar con la clase impulso biblioteca tokenizer. He encontrado este tutorial sobre la documentación impulso:
http://www.boost.org/doc / libs / 1 _36 _0 / libs / tokenizer / escapado _list _separator.htm
problema es no puedo conseguir el argumento de que escapó _separator _list ( "", "", "");
pero si modifico el realce / tokenizer.hpp depositarlas en la obra de. pero eso no es solución ideal y se preguntaba si hay algo falto de obtener diferentes argumentos en el _separator _list escapado.
quiero que sea dividido en espacios con "y" para escapar y sin carácter de escape dentro de la cadena entre comillas.
esto se utiliza para un sistema de análisis de argumentos en un sistema de la consola dentro del juego.
include <iostream>
include <boost/tokenizer.hpp>
include <string>
int main()
{
using namespace std;
using namespace boost;
string s = "exec script1 \"script argument number one\"";
string separator1("");//dont let quoted arguments escape themselves
string separator2(" ");//split on spaces
string separator3("\"\'");//let it have quoted arguments
tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)> tok(s);
for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg)
{
cout << *beg << "\n";
}
}
el error de Visual Studio 2005 es
C2974 de error: 'boost :: tokenizer': argumento no válido para la plantilla 'TokenizerFunc', tipo esperado
EDIT: Esta pregunta se awnsered por Ferruccio y explicada por todo el mundo de Peter de agradecimiento.
Solución
intente lo siguiente:
#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>
int main()
{
using namespace std;
using namespace boost;
string s = "exec script1 \"script argument number one\"";
string separator1("");//dont let quoted arguments escape themselves
string separator2(" ");//split on spaces
string separator3("\"\'");//let it have quoted arguments
escaped_list_separator<char> els(separator1,separator2,separator3);
tokenizer<escaped_list_separator<char>> tok(s, els);
for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
{
cout << *beg << "\n";
}
}
Otros consejos
Parece como si estuviera declarando su tipo tokenizer incorrectamente.
typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
Tokenizer tok( s, Separator );
for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
{ cout << *iter << "\n"; }
¿Quieres hacer un objeto escrito boost::tokenizer< boost::escaped_list_separator< char > >
con un objeto separador boost::escaped_list_separator< char >
como su TokenizerFunc.
Un punto relevante aún no la respuesta para esto es que si el usuario quiere dar salida a una doble cita en el resultado, la cita incorporado ( "") se describe en la Wikipedia ( como aquí ) debe sustituirse por una cadena de (\\\")
, donde \\
significa un char de escape y \"
: la marca de cotización. De esta manera, la marca de cotización se mostrará en el resultado de la salida.
El siguiente fragmento de código es un ejemplo.
typedef boost::escaped_list_separator<char> std_token;
typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;
std_token a_token( "\\", ",", "\"" );
std::string s = "\"Boost,\\\" C++ Libraries\" ";
tokenizer tok{ s, a_token };
for ( const auto &t : tok )
std::cout << t << '\n';