Вот некоторый код для выполнения линейного поиска кортежа для первого типа U, который он находит, и выдает ошибку времени компиляции, если он не может найти U. Обратите внимание, если кортеж содержит несколько U, он находит только первый,Не уверен, что это политика, которую вы хотите или нет.Он возвращает индекс времени компиляции в кортеж первого U. Возможно, вы могли бы использовать его в качестве индекса в вашем std::get
.
Отказ от ответственности: Собран вместе для этого ответа.Только слегка проверено.В пограничных случаях, таких как пустой кортеж, есть неприятное сообщение об ошибке, которое можно улучшить.и т. д.
#include <type_traits>
#include <tuple>
template <class Tuple, class T, std::size_t Index = 0>
struct find_first;
template <std::size_t Index, bool Valid>
struct find_first_final_test
: public std::integral_constant<std::size_t, Index>
{
};
template <std::size_t Index>
struct find_first_final_test<Index, false>
{
static_assert(Index == -1, "Type not found in find_first");
};
template <class Head, class T, std::size_t Index>
struct find_first<std::tuple<Head>, T, Index>
: public find_first_final_test<Index, std::is_same<Head, T>::value>
{
};
template <class Head, class ...Rest, class T, std::size_t Index>
struct find_first<std::tuple<Head, Rest...>, T, Index>
: public std::conditional<std::is_same<Head, T>::value,
std::integral_constant<std::size_t, Index>,
find_first<std::tuple<Rest...>, T, Index+1>>::type
{
};
#include <iostream>
int main()
{
typedef std::tuple<char, int, short> T;
std::cout << find_first<T, double>::value << '\n';
}