// ambigious conversions in the case where conversions can include a number of
// types, such as the string constructor.
template<typename T, typename std::enable_if<
- std::is_same<T, int>::value ||
- std::is_same<T, double>::value ||
- std::is_same<T, bool>::value ||
- std::is_same<T, std::string>::value ||
- std::is_same<T, OCRepresentation>::value ||
- std::is_same<T, std::vector<int>>::value ||
- std::is_same<T, std::vector<std::vector<int>>>::value ||
- std::is_same<T, std::vector<std::vector<std::vector<int>>>>::value ||
- std::is_same<T, std::vector<double>>::value ||
- std::is_same<T, std::vector<std::vector<double>>>::value ||
- std::is_same<T, std::vector<std::vector<std::vector<double>>>>::value ||
- std::is_same<T, std::vector<bool>>::value ||
- std::is_same<T, std::vector<std::vector<bool>>>::value ||
- std::is_same<T, std::vector<std::vector<std::vector<bool>>>>::value ||
- std::is_same<T, std::vector<std::string>>::value ||
- std::is_same<T, std::vector<std::vector<std::string>>>::value ||
- std::is_same<T, std::vector<std::vector<std::vector<std::string>>>>::value ||
- std::is_same<T, std::vector<OCRepresentation>>::value ||
- std::is_same<T, std::vector<std::vector<OCRepresentation>>>::value ||
- std::is_same<T, std::vector<std::vector<std::vector<OCRepresentation>>>>::value
- , int>::type = 0// enable_if
+ is_component<T,
+ remove_first<AttributeValue>::type
+ >::value
+ , int>::type = 0
>
operator T() const
{
{
constexpr static bool value = true;
};
+
+ // type trait to remove the first type from a parameter-packed list
+ template <typename T>
+ struct remove_first;
+
+ // specialization that does all the work
+ template<template <typename...> class Base, typename T, typename ...Rest>
+ struct remove_first< Base<T, Rest...> >
+ {
+ typedef Base<Rest...> type;
+ };
+
+ // type trait that will only pass if ToTest is in the parameter pack of T2
+ template<typename ToTest, typename T2>
+ struct is_component;
+
+ // specialization to handle the single-item case
+ template<typename ToTest, template <typename...> class Base, typename T>
+ struct is_component<ToTest, Base<T>>
+ {
+ static constexpr bool value = std::is_same<ToTest, T>::value;
+ };
+
+ // Recursive specialization to handle cases with multiple values
+ template<typename ToTest, template <typename...> class Base, typename T, typename ...Rest>
+ struct is_component<ToTest, Base<T, Rest...>>
+ {
+ static constexpr bool value = std::is_same<ToTest, T>::value
+ || is_component<ToTest, Base<Rest...>>::value;
+ };
} // namespace OC
#endif