More if constexpr work

This commit is contained in:
Jason Turner 2017-08-23 21:23:18 -06:00
parent dd918c524d
commit 7722841294
3 changed files with 28 additions and 50 deletions

View File

@ -112,29 +112,18 @@ namespace chaiscript
/// uses ostream operator >> to perform the conversion /// uses ostream operator >> to perform the conversion
template<typename Input> template<typename Input>
auto parse_string(const std::string &i) auto parse_string(const std::string &i)
-> typename std::enable_if<
!std::is_same<Input, wchar_t>::value
&& !std::is_same<Input, char16_t>::value
&& !std::is_same<Input, char32_t>::value,
Input>::type
{ {
if constexpr (!std::is_same<Input, wchar_t>::value
&& !std::is_same<Input, char16_t>::value
&& !std::is_same<Input, char32_t>::value) {
std::stringstream ss(i); std::stringstream ss(i);
Input t; Input t;
ss >> t; ss >> t;
return t; return t;
} } else {
template<typename Input>
auto parse_string(const std::string &)
-> typename std::enable_if<
std::is_same<Input, wchar_t>::value
|| std::is_same<Input, char16_t>::value
|| std::is_same<Input, char32_t>::value,
Input>::type
{
throw std::runtime_error("Parsing of wide characters is not yet supported"); throw std::runtime_error("Parsing of wide characters is not yet supported");
} }
}
/// Add all common functions for a POD type. All operators, and /// Add all common functions for a POD type. All operators, and
/// common conversions /// common conversions

View File

@ -777,29 +777,24 @@ namespace chaiscript
private: private:
template<typename Type> template<typename Type>
auto do_call_impl(Class *o) const -> std::enable_if_t<std::is_pointer<Type>::value, Boxed_Value> auto do_call_impl(Class *o) const
{ {
if constexpr(std::is_pointer<Type>::value) {
return detail::Handle_Return<Type>::handle(o->*m_attr); return detail::Handle_Return<Type>::handle(o->*m_attr);
} } else {
template<typename Type>
auto do_call_impl(const Class *o) const -> std::enable_if_t<std::is_pointer<Type>::value, Boxed_Value>
{
return detail::Handle_Return<const Type>::handle(o->*m_attr);
}
template<typename Type>
auto do_call_impl(Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value>
{
return detail::Handle_Return<typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr); return detail::Handle_Return<typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr);
} }
template<typename Type>
auto do_call_impl(const Class *o) const -> std::enable_if_t<!std::is_pointer<Type>::value, Boxed_Value>
{
return detail::Handle_Return<typename std::add_lvalue_reference<typename std::add_const<Type>::type>::type>::handle(o->*m_attr);
} }
template<typename Type>
auto do_call_impl(const Class *o) const
{
if constexpr(std::is_pointer<Type>::value) {
return detail::Handle_Return<const Type>::handle(o->*m_attr);
} else {
return detail::Handle_Return<typename std::add_lvalue_reference<typename std::add_const<Type>::type>::type>::handle(o->*m_attr);
}
}
static std::vector<Type_Info> param_types() static std::vector<Type_Info> param_types()

View File

@ -562,24 +562,18 @@ namespace chaiscript
/// \endcode /// \endcode
/// ///
template<typename Base, typename Derived> template<typename Base, typename Derived>
Type_Conversion base_class(typename std::enable_if<std::is_polymorphic<Base>::value && std::is_polymorphic<Derived>::value>::type* = nullptr) Type_Conversion base_class()
{ {
//Can only be used with related polymorphic types //Can only be used with related polymorphic types
//may be expanded some day to support conversions other than child -> parent //may be expanded some day to support conversions other than child -> parent
static_assert(std::is_base_of<Base,Derived>::value, "Classes are not related by inheritance"); static_assert(std::is_base_of<Base,Derived>::value, "Classes are not related by inheritance");
if constexpr(std::is_polymorphic<Base>::value && std::is_polymorphic<Derived>::value) {
return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Dynamic_Conversion_Impl<Base, Derived>>(); return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Dynamic_Conversion_Impl<Base, Derived>>();
} } else {
template<typename Base, typename Derived>
Type_Conversion base_class(typename std::enable_if<!std::is_polymorphic<Base>::value || !std::is_polymorphic<Derived>::value>::type* = nullptr)
{
//Can only be used with related polymorphic types
//may be expanded some day to support conversions other than child -> parent
static_assert(std::is_base_of<Base,Derived>::value, "Classes are not related by inheritance");
return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Static_Conversion_Impl<Base, Derived>>(); return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Static_Conversion_Impl<Base, Derived>>();
} }
}
template<typename Callable> template<typename Callable>