mirror of
https://github.com/ChaiScript/ChaiScript.git
synced 2026-02-07 18:26:49 +08:00
More if constexpr work
This commit is contained in:
parent
dd918c524d
commit
7722841294
@ -112,30 +112,19 @@ 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
|
|
||||||
{
|
{
|
||||||
std::stringstream ss(i);
|
if constexpr (!std::is_same<Input, wchar_t>::value
|
||||||
Input t;
|
&& !std::is_same<Input, char16_t>::value
|
||||||
ss >> t;
|
&& !std::is_same<Input, char32_t>::value) {
|
||||||
return t;
|
std::stringstream ss(i);
|
||||||
|
Input t;
|
||||||
|
ss >> t;
|
||||||
|
return t;
|
||||||
|
} else {
|
||||||
|
throw std::runtime_error("Parsing of wide characters is not yet supported");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// 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
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|||||||
@ -777,30 +777,25 @@ 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
|
||||||
{
|
{
|
||||||
return detail::Handle_Return<Type>::handle(o->*m_attr);
|
if constexpr(std::is_pointer<Type>::value) {
|
||||||
|
return detail::Handle_Return<Type>::handle(o->*m_attr);
|
||||||
|
} else {
|
||||||
|
return detail::Handle_Return<typename std::add_lvalue_reference<Type>::type>::handle(o->*m_attr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
auto do_call_impl(const Class *o) const -> std::enable_if_t<std::is_pointer<Type>::value, Boxed_Value>
|
auto do_call_impl(const Class *o) const
|
||||||
{
|
{
|
||||||
return detail::Handle_Return<const Type>::handle(o->*m_attr);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static std::vector<Type_Info> param_types()
|
static std::vector<Type_Info> param_types()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -562,23 +562,17 @@ 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");
|
||||||
|
|
||||||
return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Dynamic_Conversion_Impl<Base, Derived>>();
|
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>>();
|
||||||
|
} else {
|
||||||
template<typename Base, typename Derived>
|
return chaiscript::make_shared<detail::Type_Conversion_Base, detail::Static_Conversion_Impl<Base, 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>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user