creo que usted está en el camino correcto cuando se habla de "funtor" ...
Es bastante común que una opción para ser procesada por pasar su argumento (s) con el método de un objeto. Esto se puede hacer más directamente con los notificadores si puede envolver el método en algo que notifier() aceptará como argumento. Y tu puedes. (Si la función boost :: tiene una forma de hacerlo, no estoy lo suficientemente familiarizado con ella (y soy demasiado flojo para estudiarla ahora): la siguiente usa las rutinas en el encabezado funcional de STDLIB.)
Ejemplo:
Una de las opciones es --config-file, tomando un argumento de cadena, que indica la ruta de un archivo de configuración no predeterminado. Tienes una clase llamada ConfigParser. Sin notificadores, el código podría ser algo como esto:
ConfigParser *cp = new ConfigParser();
std::string cp_path;
desc.add_options()
("config-file", value<std::string>(&cp_path)->default_value("~/.myconfig"), "Config File")
// ... the rest of your options
;
cp->setPath(cp_path);
con los notificadores:
#include <functional>
ConfigParser *cp = new ConfigParser();
desc.add_options()
("config-file", value<std::string>()->default_value("~/.myconfig")->notifier(std::bind1st(std::mem_fun(&ConfigParser::setPath), cp)), "Config File")
// ... the rest of your options
;
Oh, lo veo ahora. Debe buscar "notificador", no notificar. La función de notificación ha pasado una referencia constante al valor, por lo que no puede mutarla? No veo mucho que puedas hacer aparte de arrojar una excepción si la opción es "mala". – olooney
@olooney: La intención es que tomes lo que sea la acción prevista con esa opción. Por ejemplo, si tiene una opción que cambia la ruta de búsqueda, su función de notificador modificaría la ruta de búsqueda. Como señalo en mi respuesta, puede hacer esta misma lógica en su código de análisis de opciones al seleccionar cada opción individualmente y luego tomar alguna medida, pero eso puede dar como resultado un blob de procedimiento largo que es difícil de leer o modificar. –
Claro, pero sin la capacidad de mutar el mapa_variable, pasar un identificador opaco a un objeto de entorno o enlazar con el funtor (usando la función boost ::, por ejemplo), está realmente limitado a excepciones y efectos secundarios * global *. Eso sigue siendo útil para cambiar el directorio de trabajo o establecer un indicador global "detallado", pero no es lo suficientemente general como para mover la mayor parte del análisis de opciones en notificadores. Quizás debería intentarlo antes de hacer un juicio, solo estoy teorizando aquí. – olooney