Per caso ho scoperto che con un tipo polimorfico che utilizza dynamic_cast di nuovo alla classe derivata genererebbe un errore "cast errato" se il puntatore non è più valido. È un comportamento non definito o potrebbe essere un modo per verificare i puntatori validi senza utilizzare i puntatori intelligenti?
Non sono molto contrario all'uso di puntatori intelligenti perché servono a un'esigenza reale, ma non mi piace la sintassi. Non ho nulla contro i tipi di modelli, ma trovo i puntatori intelligenti per gonfiare il codice e non sono un fan delle macro per cercare di evitarlo. Vorrei che C ++ includesse qualcosa nella sintassi del linguaggio stesso usando la funzione template ma con questa domanda sono più preoccupato di ciò che sta accadendo in basso e se questo è un modo valido e definito per verificare i puntatori validi dato che questo dà un eccezione ogni volta dai miei test.
#include <string>
#include <map>
using namespace std;
class Base
{
public:
virtual ~Base(){}
};
class Derived : public Base
{
public:
virtual ~Derived(){}
};
class Storage
{
private:
map<string, Base*> storage;
public:
void AddItem(string name, Base* base)
{
if (storage.find(name) == storage.end())
{
storage[name] = base;
}
}
template <class T>
T& FindItem(string name)
{
if (storage.find(name) != storage.end())
{
Base* item = storage[name];
return dynamic_cast<T&>(*item);
}
throw;
}
};
int main()
{
Storage store;
// force 'd' to go out of scope for our test
{
Derived d;
store.AddItem("test", &d);
}
// this will throw a bad cast exception
Derived& test = store.FindItem<Derived>("test");
return 0;
}