|
|
@@ -10,14 +10,22 @@
|
|
|
#pragma once
|
|
|
|
|
|
#include "comparable.hpp"
|
|
|
-#include "convertable.hpp"
|
|
|
|
|
|
namespace types {
|
|
|
+ template <typename Base, typename Tag, template <typename> class... Skills>
|
|
|
+ class opaque_typedef;
|
|
|
+
|
|
|
+ template <typename T> struct is_opaque_typedef {
|
|
|
+ constexpr static bool const value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ template <typename B, typename T, template <typename> class... S>
|
|
|
+ struct is_opaque_typedef<opaque_typedef<B, T, S...>> {
|
|
|
+ constexpr static bool const value = true;
|
|
|
+ };
|
|
|
+
|
|
|
template <typename Base, typename Tag, template <typename> class... Skills>
|
|
|
class opaque_typedef : public Skills<opaque_typedef<Base, Tag, Skills...>>... {
|
|
|
- public:
|
|
|
- using super = opaque_typedef;
|
|
|
-
|
|
|
private:
|
|
|
Base value_;
|
|
|
|
|
|
@@ -25,6 +33,8 @@ namespace types {
|
|
|
opaque_typedef() = default;
|
|
|
explicit opaque_typedef(Base const & value) : value_(value) {};
|
|
|
explicit opaque_typedef(Base && value) : value_(std::forward<Base>(value)) {};
|
|
|
+ template <typename B, typename T, template <typename> class... S>
|
|
|
+ opaque_typedef(opaque_typedef<B, T, S...> const & other);
|
|
|
|
|
|
Base const & get() const { return value_; }
|
|
|
explicit operator Base const &() const { return value_; }
|