except: add string_error mixin

This commit is contained in:
Danny Robson 2018-12-04 13:46:23 +11:00
parent 8c4b7ac93c
commit f3f59e1f37

View File

@ -8,7 +8,9 @@
#pragma once #pragma once
#include <utility>
#include <iosfwd> #include <iosfwd>
#include <string>
namespace cruft { namespace cruft {
/// A base exception class for all cruft libraries. /// A base exception class for all cruft libraries.
@ -24,6 +26,38 @@ namespace cruft {
}; };
/// A mixin error class that can be used when inheriting from
/// `cruft::error`.
///
/// It accepts a single std::string, saving it so that it can be passed
/// through to a std::ostream later on.
///
/// By setting `BaseT` to a locally useful error class we can still
/// maintain an appropriate exception hierarchy for a given module.
/// eg, pass `foo::error` (which derives eventually from `cruft::error`)
/// in the module `foo`.
///
/// \tparam BaseT The desired base class.
template <typename BaseT>
class string_error : public BaseT {
public:
template <typename... Args>
string_error (std::string const &_message, Args &&...args)
: BaseT (std::forward<Args> (args)...)
, m_message (_message)
{ ; }
std::ostream&
describe (std::ostream &os) const noexcept override
{
return os << m_message;
}
private:
std::string m_message;
};
/// Use `error::describe` to render the supplied error object to a /// Use `error::describe` to render the supplied error object to a
/// std::ostream. /// std::ostream.
std::ostream& std::ostream&