Por que perco informações de tipo ao usar boost :: copy_exception?

Quando eu usoboost::copy_exception para copiar uma exceção para umexception_ptr, Perco informações de tipo. Veja o seguinte código:

try {
    throw std::runtime_error("something");
} catch (exception& e) {
    ptr = boost::copy_exception(e);
}
if (ptr) {
    try {
        boost::rethrow_exception(ptr);
    } catch (std::exception& e) {
        cout << e.what() << endl;
        cout << boost::diagnostic_information(e) << endl;
    }
}

A partir disso, recebo a seguinte saída:

N5boost16exception_detail10clone_implISt9exceptionEE
Dynamic exception type: boost::exception_detail::clone_impl<std::exception>
std::exception::what: N5boost16exception_detail10clone_implISt9exceptionEE

Então, basicamenteboost::copy_exception copiou estaticamente o argumento recebid

Este problema será resolvido se eu lançar minha exceção comboost::enable_current_exception em vez disso, assim.

try {
    throw boost::enable_current_exception(std::runtime_error("something"));
} catch (...) {
    ptr = boost::current_exception();
}
if (ptr) {
    try {
        boost::rethrow_exception(ptr);
    } catch (std::exception& e) {
        cout << e.what() << endl;
        cout << boost::diagnostic_information(e) << endl;
    }
}

O problema é que, às vezes, as exceções são geradas por uma biblioteca que não usaboost::enable_current_exception. Nesse caso, existe alguma maneira de colocar a exceção em umexception_ptr além de capturar cada tipo de exceção possível, uma por uma, e useboost::copy_exception em cada um?

questionAnswers(2)

yourAnswerToTheQuestion