diff --git a/CMakeLists.txt b/CMakeLists.txt
index 908bd0852e9e8cd9e36407e0183330bca01e2327..1ec991bb415c4c82a25fb436fefee3ce3d2ea74d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -102,6 +102,7 @@ SET(${PROJECT_NAME}_HEADERS
   include/eigenpy/computation-info.hpp
   include/eigenpy/eigenpy.hpp
   include/eigenpy/exception.hpp
+  include/eigenpy/scalar-conversion.hpp
   include/eigenpy/expose.hpp
   include/eigenpy/details.hpp
   include/eigenpy/fwd.hpp
diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp
index 529bc44cc967422322e84edf058e09d11fb0a732..fddd6604b677beb40aeeaa41b4a9df034e30b63c 100644
--- a/include/eigenpy/details.hpp
+++ b/include/eigenpy/details.hpp
@@ -12,6 +12,7 @@
 #include <patchlevel.h> // For PY_MAJOR_VERSION
 #include <iostream>
 
+#include "eigenpy/scalar-conversion.hpp"
 #include "eigenpy/eigenpy.hpp"
 #include "eigenpy/numpy-type.hpp"
 #include "eigenpy/registration.hpp"
@@ -55,36 +56,7 @@ namespace boost { namespace python { namespace detail {
 namespace eigenpy
 {
 
-  template <typename SCALAR1, typename SCALAR2>
-  struct FromTypeToType : public boost::false_type {};
-  
-  template <typename SCALAR>
-  struct FromTypeToType<SCALAR,SCALAR> : public boost::true_type {};
-  
-  template <> struct FromTypeToType<int,long> : public boost::true_type {};
-  template <> struct FromTypeToType<int,float> : public boost::true_type {};
-  template <> struct FromTypeToType<int,std::complex<float> > : public boost::true_type {};
-  template <> struct FromTypeToType<int,double> : public boost::true_type {};
-  template <> struct FromTypeToType<int,std::complex<double> > : public boost::true_type {};
-  template <> struct FromTypeToType<int,long double> : public boost::true_type {};
-  template <> struct FromTypeToType<int,std::complex<long double> > : public boost::true_type {};
-  
-  template <> struct FromTypeToType<long,float> : public boost::true_type {};
-  template <> struct FromTypeToType<long,std::complex<float> > : public boost::true_type {};
-  template <> struct FromTypeToType<long,double> : public boost::true_type {};
-  template <> struct FromTypeToType<long,std::complex<double> > : public boost::true_type {};
-  template <> struct FromTypeToType<long,long double> : public boost::true_type {};
-  template <> struct FromTypeToType<long,std::complex<long double> > : public boost::true_type {};
-  
-  template <> struct FromTypeToType<float,std::complex<float> > : public boost::true_type {};
-  template <> struct FromTypeToType<float,double> : public boost::true_type {};
-  template <> struct FromTypeToType<float,std::complex<double> > : public boost::true_type {};
-  template <> struct FromTypeToType<float,long double> : public boost::true_type {};
-  template <> struct FromTypeToType<float,std::complex<long double> > : public boost::true_type {};
-
-  template <> struct FromTypeToType<double,std::complex<double> > : public boost::true_type {};
-  template <> struct FromTypeToType<double,long double> : public boost::true_type {};
-  template <> struct FromTypeToType<double,std::complex<long double> > : public boost::true_type {};
+
 
   namespace bp = boost::python;
 
diff --git a/include/eigenpy/scalar-conversion.hpp b/include/eigenpy/scalar-conversion.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..b960068af63dc2da18f77942666d129cac320bc1
--- /dev/null
+++ b/include/eigenpy/scalar-conversion.hpp
@@ -0,0 +1,44 @@
+//
+// Copyright (c) 2014-2020 CNRS INRIA
+//
+
+#ifndef __eigenpy_scalar_conversion_hpp__
+#define __eigenpy_scalar_conversion_hpp__
+
+#include "eigenpy/config.hpp"
+
+namespace eigenpy
+{
+  template <typename SCALAR1, typename SCALAR2>
+  struct FromTypeToType : public boost::false_type {};
+  
+  template <typename SCALAR>
+  struct FromTypeToType<SCALAR,SCALAR> : public boost::true_type {};
+  
+  template <> struct FromTypeToType<int,long> : public boost::true_type {};
+  template <> struct FromTypeToType<int,float> : public boost::true_type {};
+  template <> struct FromTypeToType<int,std::complex<float> > : public boost::true_type {};
+  template <> struct FromTypeToType<int,double> : public boost::true_type {};
+  template <> struct FromTypeToType<int,std::complex<double> > : public boost::true_type {};
+  template <> struct FromTypeToType<int,long double> : public boost::true_type {};
+  template <> struct FromTypeToType<int,std::complex<long double> > : public boost::true_type {};
+  
+  template <> struct FromTypeToType<long,float> : public boost::true_type {};
+  template <> struct FromTypeToType<long,std::complex<float> > : public boost::true_type {};
+  template <> struct FromTypeToType<long,double> : public boost::true_type {};
+  template <> struct FromTypeToType<long,std::complex<double> > : public boost::true_type {};
+  template <> struct FromTypeToType<long,long double> : public boost::true_type {};
+  template <> struct FromTypeToType<long,std::complex<long double> > : public boost::true_type {};
+  
+  template <> struct FromTypeToType<float,std::complex<float> > : public boost::true_type {};
+  template <> struct FromTypeToType<float,double> : public boost::true_type {};
+  template <> struct FromTypeToType<float,std::complex<double> > : public boost::true_type {};
+  template <> struct FromTypeToType<float,long double> : public boost::true_type {};
+  template <> struct FromTypeToType<float,std::complex<long double> > : public boost::true_type {};
+
+  template <> struct FromTypeToType<double,std::complex<double> > : public boost::true_type {};
+  template <> struct FromTypeToType<double,long double> : public boost::true_type {};
+  template <> struct FromTypeToType<double,std::complex<long double> > : public boost::true_type {};
+}
+
+#endif // __eigenpy_scalar_conversion_hpp__