@@ -49,24 +49,39 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
4949 using U = typename extensible_make_unsigned<T>::type;
5050
5151 struct OpenV : public V {
52+ #ifndef _MSC_VER
53+ auto get () const -> decltype(V::get()) { return V::get (); }
5254 // for explanation of OT declaration, see
5355 // https://stackoverflow.com/questions/26435084/how-to-get-the-return-type-of-a-member-function-from-within-a-class
56+ using OT = decltype ((std::declval<OpenV>().*std::declval<decltype (&OpenV::get)>())());
57+ #else
5458 using OT = decltype ((std::declval<V>().*std::declval<decltype (&V::get)>())());
5559 OT get () const { return V::get (); }
60+ #endif
5661 OpenV () = default ;
5762 explicit OpenV (OT a) : V(a) {}
5863 explicit OpenV (V x) : V(x) {}
5964 };
6065 struct OpenC : public C {
66+ #ifndef _MSC_VER
67+ auto get () const -> decltype(C::get()) { return C::get (); }
68+ using OT = decltype ((std::declval<OpenC>().*std::declval<decltype (&OpenC::get)>())());
69+ #else
6170 using OT = decltype ((std::declval<C>().*std::declval<decltype (&C::get)>())());
6271 OT get () const { return C::get (); }
72+ #endif
6373 OpenC () = default ;
6474 explicit OpenC (OT a) : C(a) {}
6575 explicit OpenC (C x) : C(x) {}
6676 };
6777 struct OpenFV : public FV {
78+ #ifndef _MSC_VER
79+ auto get () const -> decltype(FV::get()) { return FV::get (); }
80+ using OT = decltype ((std::declval<OpenFV>().*std::declval<decltype (&OpenFV::get)>())());
81+ #else
6882 using OT = decltype ((std::declval<FV>().*std::declval<decltype (&FV::get)>())());
6983 OT get () const { return FV::get (); }
84+ #endif
7085 OpenFV () = default ;
7186 explicit OpenFV (OT a) : FV(a) {}
7287 explicit OpenFV (FV x) : FV(x) {}
@@ -84,8 +99,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
8499
85100
86101 struct OpenMFV : public MFV {
102+ #ifndef _MSC_VER
103+ auto get () const -> decltype(MFV::get()) { return MFV::get (); }
104+ using OT = decltype ((std::declval<OpenMFV>().*std::declval<decltype (&OpenMFV::get)>())());
105+ #else
87106 using OT = decltype ((std::declval<MFV>().*std::declval<decltype (&MFV::get)>())());
88107 OT get () const { return MFV::get (); }
108+ #endif
89109 OpenMFV () = default ;
90110 explicit OpenMFV (OT a) : MFV(a) {}
91111 explicit OpenMFV (MFV x) : MFV(x) {}
@@ -105,8 +125,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
105125 }
106126 };
107127 struct OpenMFC : public MFC {
128+ #ifndef _MSC_VER
129+ auto get () const -> decltype(MFC::get()) { return MFC::get (); }
130+ using OT = decltype ((std::declval<OpenMFC>().*std::declval<decltype (&OpenMFC::get)>())());
131+ #else
108132 using OT = decltype ((std::declval<MFC>().*std::declval<decltype (&MFC::get)>())());
109133 OT get () const { return MFC::get (); }
134+ #endif
110135 OpenMFC () = default ;
111136 explicit OpenMFC (OT a) : MFC(a) {}
112137 explicit OpenMFC (MFC x) : MFC(x) {}
@@ -126,8 +151,13 @@ class ConcreteMontgomeryForm final : public AbstractMontgomeryForm<ut_numeric_li
126151 }
127152 };
128153 struct OpenMFFV : public MFFV {
154+ #ifndef _MSC_VER
155+ auto get () const -> decltype(MFFV::get()) { return MFFV::get (); }
156+ using OT = decltype ((std::declval<OpenMFFV>().*std::declval<decltype (&OpenMFFV::get)>())());
157+ #else
129158 using OT = decltype ((std::declval<MFFV>().*std::declval<decltype (&MFFV::get)>())());
130159 OT get () const { return MFFV::get (); }
160+ #endif
131161 OpenMFFV () = default ;
132162 explicit OpenMFFV (OT a) : MFFV(a) {}
133163 explicit OpenMFFV (MFFV x) : MFFV(x) {}
0 commit comments