Il dynamic_cast si usa quando è necessario convertire un puntatore da classe base in puntatore a classe derivata. Se il compilatore non ha abbastanza informazioni per risolvere a compile time un cast diverso, ad esempio in presenza di ereditarietà multipla da più classi, a diamante oppure virtuale, il dynamic_cast è obbligato. (Ovviamente serve almeno un metodo virtuale, di solito il distruttore.) Da notare che in quelle situazioni, nemmeno il brutal_cast del C può fare qualcosa.

Da quello che vedo, quelli sono smart pointer di tipo intrusivo che fanno un cast dalla classe Object in giù. Se le tue classi hanno solo un ramo di derivazione (quindi non ereditano da più classi), probabilmente puoi usare anche lo StaticCast (che però non ti da garanzia che il puntatore ottenuto sia effettivamente valido).