# result Simple header-only variant-driven C++17 `Result` implementation. ## Requirements * c++17 or c++1z with support of variant ## Features * Small, header-only. * Pure C++. * Human and machine readable (with custom return errors support) error representation. * Compile-time check of dereference. ## Usage example ```cpp #include #include #include "result.hpp" using namespace std::string_literals; enum class ErrorCode { Error }; using IError = Result::Error; template using IResult = Result::Result; class Test { public: Test() = default; ~Test() = default; friend std::ostream &operator<<(std::ostream &os, const Test &) { os << "I'm test class"; return os; }; }; template Result::Content print_example(IResult r) { switch (r.type()) { case Result::Content::Value: std::cout << "Result has value " << r.get() << std::endl; break; case Result::Content::Error: std::cout << "Result has error " << r.error().message() << std::endl; break; case Result::Content::Empty: std::cout << "Result does not contain anything" << std::endl; break; } return r.type(); } int main() { assert(print_example(42) == Result::Content::Value); assert(print_example(IError("int error"s)) == Result::Content::Error); assert(print_example("a string"s) == Result::Content::Value); assert(print_example(IError("std::string error"s)) == Result::Content::Error); assert(print_example(Test()) == Result::Content::Value); assert(print_example(IError("Test error"s)) == Result::Content::Error); return 0; } ``` ### `Result::match` function Alternatively you can use tempalte function to do result match, e.g.: ```cpp template Result::Content print_example(IResult r) { Result::match(r, [](const T &value) { std::cout << "Result has value " << value << std::endl; }, [](const IError &error) { std::cout << "Result has error " << error.message() << std::endl; }); return r.type(); } ```