Attualmente sto sperimentando con la libreria FLTK GUI ma non sono sicuro di cosa stia succedendo con le funzioni di callback —, in particolare il tipo casting è un po 'estraneo a me. L'esempio seguente mostra una finestra di base con un pulsante con l'etichetta "Press". Quando si preme il pulsante, l'etichetta cambia in "Fatto".Funzioni Casting/Callback
L'etichetta che viene passato alla funzione di callback viene dichiarata come tipo const char*
e poi è gettato digitare void*
, ma è possibile dichiarare questo come un std::string
e poi gettato a void*
? Preferisco utilizzare le stringhe C++ moderne della notazione char
.
Inoltre, la sintassi è il modo migliore per trasmettere da un tipo all'altro? Ho visto prima il static_cast<type>()
, ma qual è il modo più sicuro/migliore per fare un cast da const char*
a void*
o viceversa e perché? Cosa raccomanderebbe C++ 11?
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Native_File_Chooser.H>
#include <string>
void xyz_callback(Fl_Widget* w, void* userdata)
{
Fl_Button* b = (Fl_Button*)w; //cast widget w to button and assign to b
b->label((const char*)userdata); //cast userdata back to type const char*
}
int main(int argc, char **argv)
{
Fl_Window *window = new Fl_Window(340,180);
Fl_Button *button = new Fl_Button(20,40,300,100, "label");
button->label("Press");
button->labelfont(FL_BOLD+FL_ITALIC);
button->labelsize(36);
button->labeltype(FL_SHADOW_LABEL);
button->when(FL_WHEN_RELEASE);
const char* word = "Done";
button->callback(xyz_callback, (void*)word); //cast word to type void*
window->end();
window->show(argc, argv);
return Fl::run();
}
ma è possibile dichiarare questo come uno std :: string e poi gettato a "void *"? Si. –
@BartekBanachewicz Vuoi lanciare std :: string o un puntatore a std :: string? – harper
Bene, un puntatore ad esso. –