Suppose I want to create a compile-time heterogenous container of unique types from some sequence of non-unique types. In order to do this I need to iterate over th
Here is a version that does not recursively instantiate the template to check for a matching type. Instead it uses SFINAE with indices-based meta-programming:
#include
#include
template
struct index_sequence {
typedef index_sequence next;
};
template
struct make_index_sequence {
typedef typename make_index_sequence::type::next type;
};
template <>
struct make_index_sequence<0> {
typedef index_sequence<> type;
};
template
using make_index_sequence_t = typename make_index_sequence::type;
template
struct lookup;
template
struct lookup>
{
private:
struct null;
template
static std::false_type
apply(std::conditional_t::value, null, Args>...);
template
static std::true_type apply(...);
template
static auto apply_helper(Args&&...) ->
decltype(apply...>(std::declval()...));
public:
template
using value = decltype(
apply_helper(
std::declval<
typename std::tuple_element::type
>()...
)
);
};
template
using has_type = decltype(
typename lookup::value>
>::template value{}
);
Live Demo