diff --git a/src/blackmisc/tuple_private.h b/src/blackmisc/tuple_private.h index 6e6336f55..aad5a2479 100644 --- a/src/blackmisc/tuple_private.h +++ b/src/blackmisc/tuple_private.h @@ -29,6 +29,46 @@ namespace BlackMisc namespace Private { +#ifdef Q_COMPILER_VARIADIC_TEMPLATES + + // Helper trait to detect whether a class is a tuple. + //! \private + //! @{ + template + struct IsTuple : public std::false_type {}; + template + struct IsTuple> : public std::true_type {}; + //! @} + +#else // !Q_COMPILER_VARIADIC_TEMPLATES + + template + struct IsTuple : public std::false_type {}; + template <> + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + template + struct IsTuple> : public std::true_type {}; + +#endif // !Q_COMPILER_VARIADIC_TEMPLATES + // Using SFINAE to help detect missing BLACK_ENABLE_TUPLE_CONVERSION macro in static_assert //! \private std::false_type hasEnabledTupleConversionHelper(...); @@ -67,12 +107,8 @@ namespace BlackMisc template int compareHelper(const Tu &a, const Tu &b) { - typedef typename std::is_base_of < - CValueObject, - typename std::decay < - typename std::tuple_element::type - >::type - >::type isCValueObjectTag; + typedef typename std::decay::type>::type Element; + typedef std::integral_constant::value || IsTuple::value> isCValueObjectTag; return compareHelper(std::get(a), std::get(b), isCValueObjectTag()); }