mapbox/variant: Implement std::get_if interface

Some of the code in the openbmc project uses their own ad-hoc get_if
style interface. We need to provide one on the mapbox side to ease the
transition.

Tested:
    Built code against the get_if implementation to make sure it
    conforms to the same behavior as std::get_if.

Change-Id: I8560a2d13110ab7fd82a21835a5e233682003fa8
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/mapbox/variant.hpp b/mapbox/variant.hpp
index 7c02032..ea980b3 100644
--- a/mapbox/variant.hpp
+++ b/mapbox/variant.hpp
@@ -1113,6 +1113,16 @@
     return var.template get_unchecked<ResultType>();
 }
 
+template <typename ResultType, typename... Types>
+std::add_pointer_t<ResultType> get_if(variant<Types...>* v)
+{
+    if (v == nullptr || !v->template is<ResultType>())
+    {
+        return nullptr;
+    }
+    return &v->template get_unchecked<ResultType>();
+}
+
 #ifdef HAS_EXCEPTIONS
 template <typename ResultType, typename T>
 auto get(T const& var) -> decltype(var.template get<ResultType>())
@@ -1126,6 +1136,17 @@
 {
     return var.template get_unchecked<ResultType>();
 }
+
+template <typename ResultType, typename... Types>
+std::add_pointer_t<const ResultType> get_if(const variant<Types...>* v)
+{
+    if (v == nullptr || !v->template is<ResultType>())
+    {
+        return nullptr;
+    }
+    return &v->template get_unchecked<ResultType>();
+}
+
 } // namespace util
 } // namespace mapbox