Pregunta

Estoy tratando de entender el ejemplo de las opciones de programa de la biblioteca de impulso ( http://www.boost.org/doc/libs/1_38_0/doc/html/program_options/tutorial.html#id3761458 )

Especialmente esta parte:

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

¿qué está haciendo exactamente aquí y qué técnica es esa?

Esta parte desc.add_options () podría ser una llamada a la función, pero ¿cómo encaja el otro () aquí? ¿Es esto algún tipo de sobrecarga del operador?

¡Gracias!

¿Fue útil?

Solución

Las " add_options () " La función en realidad devuelve un functor , es decir, un objeto que anula el operador (). Esto significa que la siguiente función llama

desc.add_options() ("help", "produce help message");

en realidad se expande a

desc.add_options().operator()("help", "produce help message");

El " operador () " también devuelve un functor, para que las llamadas se puedan encadenar como ha mostrado.

Otros consejos

Presumiblemente add_options () devuelve algún tipo de functor que tiene el operador () sobrecargado para admitir " encadenamiento " (que es una técnica muy útil, por cierto)

La sobrecarga (...) le permite crear una clase que actúa como una función.

Por ejemplo:

struct func
{
    int operator()(int x)
    {
        cout << x*x << endl;
    }
};

...

func a;
a(5); //should print 25

Sin embargo, si hace que operator () devuelva una referencia al objeto , puede "encadenar" operadores.

struct func
{
    func& operator()(int x)
    {
        cout << x*x << endl;
        return *this;
    }
};

...

func a;
a(5)(7)(8); //should print 25 49 64 on separate lines

Dado que a (5) devuelve a, (a (5)) (7) es más o menos idéntico a a (5); a (7); .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top