提升:API在1.46.1和1.58.0之间变化?

时间:2016-01-26 07:49:26

标签: c++ api boost compatibility boost-exception

我的应用程序是在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 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 个答案:

答案 0 :(得分:4)

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取代(因此转换函数可能不必要),但是如果没有所有代码,我很难确定。