Aquí hay un código para hacer una búsqueda lineal de una tupla para el primer tipo U que encuentra, y da un error en tiempo de compilación si no puede encontrar U. Nota si la tupla contiene múltiples U solo encuentra la primera uno. No estoy seguro si esa es la política que quiere o no. Devuelve el índice de tiempo de compilación en la tupla de la primera U. Quizás podría usarlo como el índice en su std::get
.
Descargo de responsabilidad: Arrojados juntos para esta respuesta. Solo ligeramente probado. Las mayúsculas y minúsculas, como una tupla vacía, tienen un desagradable mensaje de error que podría mejorarse. etc.
#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';
}
C++ 14, y por lo tanto algunas implementaciones de la biblioteca estándar proporcionan 'std :: conseguir> (m_storage) '. Debería verificar y ver si el suyo tiene esta característica, hace las cosas muy fáciles. –