boost::any_cast
-
hallo ich habe gelesen, dass man beim any_cast so vorgehen sollte:
int i =3; any a = i; if(int* p = any_cast<int> (&a) // ...wie gehe ich vor, wenn ich einen zeiger im any habe?
int* p = new int; any a = p; int* k = boost::any_cast<int* >(a);ist das genau so gut oder sollte ich dann mit zeigerzeigern arbeiten?
-
was mich nämlich stört ist dass ich fehlermeldungen vom compiler erhalte wenn ichj mit zeigern in any arbeite:
folgendes klappt:
int i =3; container = i; if(double* p = boost::any_cast<double> (&container)) cout << "gut so"; else cout << "nicht gut";aber wenn ich statt einem wert einen zeiger speichere klappen solche unterscheidungen nicht...
we geht das richtig?
-
shisha schrieb:
hallo ich habe gelesen, dass man beim any_cast so vorgehen sollte:
Gib mal die Quelle an, wo du diese Empfehlung her hast. Ich empfinde dies als eine äusserst schlechte Empfehlung. Wenn man schon Exceptions hat, dann sollte man doch echt nicht auf C Style Fehlerprüfungen zurückgreifen.
Und falls du mehrere Möglichkeiten hast, was in
boost::anygespeichert sein könnte, dann geh über denstd::type_info, um herauszufinden, was inboost::anygespeichert ist.shisha schrieb:
was mich nämlich stört ist dass ich fehlermeldungen vom compiler erhalte wenn ichj mit zeigern in any arbeite:
[...]
aber wenn ich statt einem wert einen zeiger speichere klappen solche unterscheidungen nicht...
"Es klappt nicht"
"Es gibt Kompilerfehler"
Wieso gibst du uns nicht genauere Beschreibungen? Wieso gibst du uns nicht die Fehlermeldungen? Alles muss man euch aus der Nase ziehen ...
*holt die grosse Nasenzange*shisha schrieb:
we geht das richtig?
Wahrscheinlich so:
int* p = 0; boost::any<int*> anything = p; int** pp = boost::any_cast<int*>(&anything); // pp ist ein Zeiger auf einen Zeiger. if(pp) { p = *pp; }Grüssli
-
Folgendes geht nicht, was deinem Post entsprechen dürfte:
#include <iostream> #include <boost/any.hpp> using namespace std; int main() { boost::any container; int* p = new int; container = p; if(double** k = boost::any_cast<int* >(&container)) cout << p << " " << k << endl; else cout << "nicht so gut"; return 0; }geht nicht heißt in dem Falle:
/home/kleopatra/Dokumente/Programmieren/C++/Boost1/main.cpp|14|Fehler: »int**« kann nicht nach »double**« in initialization umgewandelt werden|
aber du meinst, dass ich ohnehin mit den exceptions arbeiten soll?
nunja:
#include <iostream> #include <boost/any.hpp> using namespace std; int main() { boost::any container; int* p = new int; container = p; try { if(double** k = boost::any_cast<int* >(&container)) cout << p << " " << k << endl; else cout << "nicht so gut"; } catch(boost::bad_any_cast&) { cout << " WIRKLICH nicht gut ..."; } return 0; }selbe meldung wie oben, wobei ich einige kombinationen ausprobiert habe...
ich möchte hier gerne prüfen können ob der cast möglich ist... aber von meinem Programm... und keine Kompilierfehler - wie müsste ich das richtig schreiben?
-
Dravere schrieb:
shisha schrieb:
hallo ich habe gelesen, dass man beim any_cast so vorgehen sollte:
Gib mal die Quelle an, wo du diese Empfehlung her hast. Ich empfinde dies als eine äusserst schlechte Empfehlung. Wenn man schon Exceptions hat, dann sollte man doch echt nicht auf C Style Fehlerprüfungen zurückgreifen.
Sehe ich anders. Ein fehlgeschlagener Cast ist bei
boost::anymit Sicherheit keine Ausnahme, sondern ein vorhersehbares und nicht selten auftretendes Ereignis.
-
Tachyon schrieb:
Dravere schrieb:
shisha schrieb:
hallo ich habe gelesen, dass man beim any_cast so vorgehen sollte:
Gib mal die Quelle an, wo du diese Empfehlung her hast. Ich empfinde dies als eine äusserst schlechte Empfehlung. Wenn man schon Exceptions hat, dann sollte man doch echt nicht auf C Style Fehlerprüfungen zurückgreifen.
Sehe ich anders. Ein fehlgeschlagener Cast ist bei
boost::anymit Sicherheit keine Ausnahme, sondern ein vorhersehbares und nicht selten auftretendes Ereignis.Genau, es darf gar nicht vorkommen. Wenn es vorkommt, dann ist es eine Exception. Wenn man auf den Typ prüfen will, dann gibt es von boost::any andere Möglichkeiten:
http://www.boost.org/doc/libs/1_39_0/doc/html/boost/any.html#id800190-bb@shisha,
Lern C++, dann verstehst du die Fehlermeldung selber.
Lies die Boost.Any Dokumentation, dann vertehst du, was du bei der Exceptionversion falsch gemacht hast. Auch hilfreich ist da, wenn man C++ kann.Grüssli