[C con Clase] Otra expresion que me resulta rara

Steven Davidson srd4121 en njit.edu
Vie Ene 30 23:21:15 CET 2009


Hola Ferrán,

Ferran Ferri wrote:
> Pues me encuentro con esta expresion en la documentacion de boost, en
> el tutorial de program_options
> 
> codigo:
> // Declare the supported options.
> po::options_description desc("Allowed options");
> desc.add_options()
>     ("help", "produce help message")
>     ("compression", po::value<int>(), "set compression level")
> ;
> 
> 
> Es correcta? Que significa? Es decir, intuyo lo que quiere decir pero
> por un lado no me suenan en C++ expresiones del tipo F()() y por otro

Se puede hacer, pero sinceramente no he visto que se escriba código de 
esta manera. Esto también se puede hacer en C: se retorna un puntero a 
una función la cual se usa para invocarla con los parámetros necesarios. 
En este caso, esta otra función también retornaría otro puntero a una 
función la cual se invoca con los otros tres parámetros requeridos.

En lugar de hacer todo por "pasos", el programador decidió hacerlo todo 
en una sola expresión. Podría haber reescrito lo anterior de esta manera:

F temp1 = desc.add_options();
G temp2 = temp1( "help", "produce help message" );
temp2( "compression", po::value<int>(), "set compression level" );

En C, 'F' y 'G' serían tipos definidos a partir de punteros a funciones, 
mientras que en C++ podrían ser clases.

> lado me resulta extraño que una linea tenga 2 paramentros
>  ("help", "produce help message")
> 
> y la siguiente tres
>     ("compression", po::value<int>(), "set compression level")
> 

No veo por qué iba a resultar extraño tener parámetros. Recuerda que son 
parámetros de una función. Si no hay funciones de por medio, entonces 
existe un error sintáctico.

> La documentacion habla de que es una sobrecarga del operador () pero
> en c++ se pueden encadenar operadores asi? Eso seria como hacer una
> linea con el operador suma asi:
> a+++++;

Sí. Aunque el ejemplo que acabas de poner sí es un error, ya que has 
puesto cinco símbolos +. Si fueran 4 ó 6 o si existiese otro operando a 
la izquierda de esos operadores, entonces no habría ningún problema.

De hecho, existe la "clásica" encadenación de operadores:

cout << "help" << "produce help message";
cout << "compression" << po::value<int>() << "set compression level";

O incluso con la clase 'string':

string str;

str += "help" + "produce help message";

Con tal de que se definan las reglas semánticas, podemos escribir 
algunas expresiones "raras". Obviamente, la sintaxis debe prevalecer, 
porque no podemos cambiarla. Pero C++ sí nos permite cambiar la 
semántica de algunos operadores.


Espero haber aclarado el asunto.

Steven





Más información sobre la lista de distribución Cconclase