Cuando se consideran los casos especiales, el código sencillo original se hace más complejo. Creo que esto queda en evidencia en el codigo que presentas.
En mi opinión la versión con istringstream que ofrezco es sencilla (no usa índices, por ejemplo) y no requiere considerar tantos casos especiales.
A próposito de casos especiales, olvidé mencionar uno: El string vacío. Se debería retornar 0.
Por último, la versión con istringstream igual tiene al menos 1 problema, pero creo que permitiré que alguien más encuentre éste en vez de auto-inmolarme
.