提升:API 在 1.46.1 和 1.58.0 之间变化?
Boost: API changes between 1.46.1 and 1.58.0?
我的应用程序使用的是 Boost 版本 1.46.1。
我想在 Boost 版本 1.58.0 上移植我的应用程序。
但是我面临一些问题。
我注意到 boost 1.58 与 1.46.1 有不同的 boost::exception_ptr
实现。在 1.46.1 中,boost::exception_ptr
被实现为共享指针:
typedef shared_ptr<exception_detail::clone_base const> exception_ptr;
在 1.58 中,所有实现都封装在 class 中。
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;
}
你能给我建议一下,如何解决上面的错误吗??
谢谢
boost::exception_ptr
是默认可构造的,可复制构造的,可分配的和可比较的。 None 这些操作允许您提取捕获的异常本身。 class 本身没有指定其他操作。这从 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
替换(因此可以不需要转换函数),但是如果没有所有代码,我很难确定。
我的应用程序使用的是 Boost 版本 1.46.1。 我想在 Boost 版本 1.58.0 上移植我的应用程序。 但是我面临一些问题。
我注意到 boost 1.58 与 1.46.1 有不同的 boost::exception_ptr
实现。在 1.46.1 中,boost::exception_ptr
被实现为共享指针:
typedef shared_ptr<exception_detail::clone_base const> exception_ptr;
在 1.58 中,所有实现都封装在 class 中。
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;
}
你能给我建议一下,如何解决上面的错误吗??
谢谢
boost::exception_ptr
是默认可构造的,可复制构造的,可分配的和可比较的。 None 这些操作允许您提取捕获的异常本身。 class 本身没有指定其他操作。这从 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
替换(因此可以不需要转换函数),但是如果没有所有代码,我很难确定。