瀏覽代碼

Make the template constructor work - looks like the answer is to not use type_traits.

Sam Jaffe 5 年之前
父節點
當前提交
134949c989
共有 2 個文件被更改,包括 5 次插入11 次删除
  1. 1 5
      include/opaque_typedef/opaque_typedef.hpp
  2. 4 6
      test/opaque_typedef_test.cpp

+ 1 - 5
include/opaque_typedef/opaque_typedef.hpp

@@ -9,8 +9,6 @@
 
 #pragma once
 
-#include <type_traits>
-
 #include "comparable.hpp"
 
 namespace types {
@@ -36,11 +34,9 @@ namespace types {
     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)
-        : opaque_typedef(other.template as<opaque_typedef>()) {}
+    opaque_typedef(opaque_typedef<B, T, S...> const & other);
     
     Base const & get() const { return value_; }
     explicit operator Base const &() const { return value_; }
-    template <typename To> To as() const;
   };
 }

+ 4 - 6
test/opaque_typedef_test.cpp

@@ -13,13 +13,11 @@
 using degree = types::opaque_typedef<double, struct degree_tag, types::Comparable>;
 using radian = types::opaque_typedef<double, struct radian_tag, types::Comparable>;
 
-template <> template <> radian degree::as() const {
-  return radian{ get() * M_PI_2 / 90.0 };
-}
+template <> template <>radian::opaque_typedef(degree const & other)
+    : radian(other.get() * M_PI_2 / 90.0) {}
 
-template <> template <> degree radian::as() const {
-  return degree{ get() * 90.0 / M_PI_2 };
-}
+template <> template <> degree::opaque_typedef(radian const & other)
+    : degree(other.get() * 90.0 / M_PI_2) {}
 
 void PrintTo(radian const & ot, std::ostream * os) {
   (*os) << double(ot)/M_PI << "π";