@@ -145,15 +145,15 @@ class fvar {
145
145
// RealType(ca) | RealType | RealType is copy constructible from the arithmetic types.
146
146
explicit fvar (root_type const &); // Initialize a constant. (No epsilon terms.)
147
147
148
- template <typename RealType2>
148
+ template <typename RealType2, typename std::enable_if<std::is_convertible<RealType2, RealType>::value>::type* = nullptr >
149
149
fvar (RealType2 const & ca); // Supports any RealType2 for which static_cast<root_type>(ca) compiles.
150
150
151
151
// r = cr | RealType& | Assignment operator.
152
152
fvar& operator =(fvar const &) = default ;
153
153
154
154
// r = ca | RealType& | Assignment operator from the arithmetic types.
155
- // Handled by constructor that takes a single parameter of generic type.
156
- // fvar& operator=(root_type const&); // Set a constant.
155
+ template < typename RealType2>
156
+ typename std::enable_if<std::is_convertible<RealType2, RealType>::value, fvar&>::type& operator =(RealType2 const &);
157
157
158
158
// r += cr | RealType& | Adds cr to r.
159
159
template <typename RealType2, size_t Order2>
@@ -678,19 +678,18 @@ fvar<RealType, Order>::fvar(root_type const& ca) : v{{static_cast<RealType>(ca)}
678
678
679
679
// Can cause compiler error if RealType2 cannot be cast to root_type.
680
680
template <typename RealType, size_t Order>
681
- template <typename RealType2>
681
+ template <typename RealType2, typename std::enable_if<std::is_convertible<RealType2, RealType>::value>::type* >
682
682
fvar<RealType, Order>::fvar(RealType2 const & ca) : v{{static_cast <RealType>(ca)}} {}
683
683
684
- /*
685
684
template <typename RealType, size_t Order>
686
- fvar<RealType,Order>& fvar<RealType,Order>::operator=(root_type const& ca)
685
+ template <typename RealType2>
686
+ typename std::enable_if<std::is_convertible<RealType2, RealType>::value, fvar<RealType, Order>&>::type& fvar<RealType,Order>::operator =(RealType2 const & ca)
687
687
{
688
688
v.front () = static_cast <RealType>(ca);
689
- if constexpr (0 < Order)
689
+ BOOST_IF_CONSTEXPR (0 < Order)
690
690
std::fill (v.begin ()+1 , v.end (), static_cast <RealType>(0 ));
691
691
return *this ;
692
692
}
693
- */
694
693
695
694
template <typename RealType, size_t Order>
696
695
template <typename RealType2, size_t Order2>
0 commit comments