changeset 6:cc90585713b4

replace types: with mpl::if_
author Lewin Bormann <lbo@spheniscida.de>
date Wed, 25 Mar 2020 13:12:14 +0100
parents 9baf70ea6f0d
children df07e266e3e5
files src/replace_type.cc
diffstat 1 files changed, 12 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/replace_type.cc	Wed Mar 25 10:46:31 2020 +0100
+++ b/src/replace_type.cc	Wed Mar 25 13:12:14 2020 +0100
@@ -1,5 +1,8 @@
 #include <iostream>
 #include <type_traits>
+#include <boost/mpl/if.hpp>
+
+namespace mpl = boost::mpl;
 
 template<typename C, typename X, typename Y>
 struct replace_type {
@@ -46,22 +49,26 @@
 
 template<typename C, typename X, typename Y>
 struct replace_type<C*, X, Y> {
-    typedef typename replace_type_ptr_helper<std::is_same<C*, X>::value, C*, X, Y>::type type;
+    //typedef typename replace_type_ptr_helper<std::is_same<C*, X>::value, C*, X, Y>::type type;
+    typedef typename mpl::if_<std::is_same<C*, X>, Y, typename replace_type<C, X, Y>::type*>::type type;
 };
 
 template<typename C, typename X, typename Y>
 struct replace_type<C&, X, Y> {
-    typedef typename replace_type_ptr_helper<std::is_same<C&, X>::value, C&, X, Y>::type type;
+    //typedef typename replace_type_ptr_helper<std::is_same<C&, X>::value, C&, X, Y>::type type;
+    typedef typename mpl::if_<std::is_same<C&, X>, Y, typename replace_type<C, X, Y>::type&>::type type;
 };
 
 template<typename C, typename X, typename Y>
 struct replace_type<C&&, X, Y> {
-    typedef typename replace_type_ptr_helper<std::is_same<C&&, X>::value, C&&, X, Y>::type type;
+    //typedef typename replace_type_ptr_helper<std::is_same<C&&, X>::value, C&&, X, Y>::type type;
+    typedef typename mpl::if_<std::is_same<C&&, X>, Y, typename replace_type<C, X, Y>::type&&>::type type;
 };
 
 template<typename C, typename X, typename Y>
 struct replace_type<const C, X, Y> {
-    typedef const typename replace_type_ptr_helper<std::is_same<const C, X>::value, const C, X, Y>::type type;
+    //typedef const typename replace_type_ptr_helper<std::is_same<const C, X>::value, const C, X, Y>::type type;
+    typedef typename mpl::if_<std::is_same<const C, X>, Y, const typename replace_type<C, X, Y>::type>::type type;
 };
 
 template<typename R, typename A, typename X, typename Y>
@@ -70,7 +77,7 @@
 };
 
 int main(void) {
-    typedef const long long* typ;
+    typedef const long long& (*typ)(long long&&);
     std::cout << typeid(typ).name() << std::endl;
     std::cout << typeid(replace_type<typ, long long, unsigned>::type).name() << std::endl;
     return 0;