Повышение: API изменяется между 1.46.1 и 1.58.0?

Мое приложение на Boost версии 1.46.1.
Я хочу портировать свое приложение на Boost версии 1.58.0.
Однако я сталкиваюсь с некоторыми проблемами.

Я заметил, что Boost 1.58 имеет другую реализацию boost::exception_ptr от 1.46.1. В 1.46.1, boost::exception_ptr был реализован как разделяемый указатель:

typedef shared_ptr<exception_detail::clone_base const> exception_ptr;

где, как и в 1.58, вся реализация была инкапсулирована внутри класса.

class exception_ptr {
typedef boost::shared_ptr<exception_detail::clone_base const> impl;
impl ptr_;
friend void rethrow_exception(exception_ptr const &);
typedef exception_detail::clone_base const *(impl::*unspecified_bool_type)() const;

public:
exception_ptr() {}
explicit exception_ptr(impl const &ptr) : ptr_(ptr) {}
bool operator==(exception_ptr const &other) const { return ptr_ == other.ptr_; }
bool operator!=(exception_ptr const &other) const { return ptr_ != other.ptr_; }
operator unspecified_bool_type() const { return ptr_ ? &impl::get : 0; }
};

Из-за этих изменений мой код ломается … 🙁


boost::exception_ptr ExceptionHelper::GetExceptionPtr(MyExceptionPtr_t exception) {
boost::exception_ptr result =
boost::dynamic_pointer_cast<boost::exception_detail::clone_base const>(exception); // This is giving build error
return result;
}

MyExceptionPtr_t ExceptionHelper::TryGetMyExceptionPtr(boost::exception_ptr exception) {
MyExceptionPtr_t result;

boost::shared_ptr<const Exception> constPtr =
boost::dynamic_pointer_cast<const Exception>(exception); // This is giving build error.
if (constPtr) {
result = boost::const_pointer_cast<Exception>(constPtr);
}
return result;
}

std::string ExceptionHelper::GetThrowFilename(const boost::exception_ptr exception) {
std::string result;
if (exception) {
if (boost::get_error_info<boost::throw_file>(*exception)) // This is giving build error.
{
result = *boost::get_error_info<boost::throw_file>(*exception);
}
}
return result;
}

Не могли бы вы подсказать мне, как исправить вышеуказанные ошибки ??

Спасибо

1

Решение

boost::exception_ptr по умолчанию: конструируемый, копируемый, назначаемый и сопоставимый по равенству. Ни одна из этих операций не позволяет вам извлечь захваченное исключение. Никакие другие операции не указаны в самом классе. Это не изменилось с 1.46.1 до 1.58.0; единственное отличие состоит в том, что реализация была изменена, поэтому сложнее случайно использовать функции boost::exception_ptr которые не являются частью указанного интерфейса (как ваш код).

Возможны только другие операции:

template <class T>
exception_ptr copy_exception( T const & e );

exception_ptr current_exception();

void rethrow_exception( exception_ptr const & ep );

rethrow_exception это функция, которую вы хотите здесь. Чтобы извлечь данные из exception_ptr, сбросьте его, а затем обработайте данные в блоке catch (это соответствует модели, используемой для std::exception_ptr, поэтому вам не придется вносить дальнейшие изменения, когда вы в конечном итоге перейдете к компилятору, который поддерживает C ++ 11):

std::string ExceptionHelper::GetThrowFilename(
const boost::exception_ptr exception)
{
std::string result;
if (!exception) return result;
try {
boost::rethrow_exception(exception);
}
catch (boost::exception const &e) {
boost::throw_file::value_type const *throw_file_data =
boost::get_error_info<boost::throw_file>(e)
if (throw_file_data) {
result = *throw_file_data;
}
}
return result;
}

Я не знаю что MyExceptionPtr_t для. Похоже, его можно заменить boost::exception_ptr (и поэтому функции преобразования можно было бы сделать ненужными), но без всего кода мне трудно сказать наверняка.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]