Use throw_with_nested e capture a exceção aninhada

Eu realmente gosto std :: throw_with_nested em c + + 11, uma vez que emula printStackTrace () do java, mas agora estou apenas curioso como capturar uma exceção aninhada, por exemplo:

void f() {
    try {
        throw SomeException();
    } catch( ... ) {
        std::throw_with_nested( std::runtime_error( "Inside f()" ) );
    }
}
void g() {
    try {
        f();
    } catch( SomeException & e ) { // I want to catch SomeException here, not std::runtime_error, :(
        // do something
    }
}

Anteriormente, eu pensava que std :: throw_with_nested gera uma nova exceção que é multiplamente derivada de duas exceções (std :: runtime_error e SomeException) mas depois de ler algum tutorial online, ele encapsula SomeException dentro de std :: exception_ptr e é probabaly porque eu não consigo pegá-lo .

Então eu percebi que eu posso consertar isso usando std :: rethrow_if_nested (e), mas o caso acima é apenas dois níveis, o que é fácil de manejar, mas pensando em situações mais gerais como 10 level fold e eu simplesmente não quero escrever std: : rethrow_if_nested 10 vezes para lidar com isso.

Qualquer sugestão seria muito apreciada.

questionAnswers(1)

yourAnswerToTheQuestion