template <class T> struct Lift : public std::false_type {
using type = T;
};
+ template <class T> struct Drop : public std::false_type {
+ using type = T;
+ };
bool operator==(const Unit& other) const { return true; }
bool operator!=(const Unit& other) const { return false; }
};
using type = Unit;
};
+// Drop Unit into void.
+template <>
+struct Unit::Drop<Unit> : public std::true_type {
+ using type = void;
+};
+
+// Drop void into void (identity).
+template <>
+struct Unit::Drop<void> : public std::true_type {
+ using type = void;
+};
+
template <class T>
struct is_void_or_unit : public Unit::Lift<T>
{};