dato unCome dividere una tupla?
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
Come posso ottenere un std::tuple<Tail...>
che contiene tutti gli elementi da t
tranne che per il primo?
credo che questo sia una domanda interessante in generale, ma qui è la mia motivazione per il contesto:
mi piacerebbe realizzare un hash per le tuple. Ho usato this answer come base. Ho scoperto che c'è stato un errore in esso, vale a dire non chiamare operator()
dell'oggetto hash con un valore:
return left()^right();
dovrebbe essere:
return left(std::get<0>(e))^right(???);
Il ??? sarebbero gli elementi rimanenti della tupla per continuare l'istanza ricorsiva del modello. Ecco il codice completo compresa la parte di terminazione:
#include <functional>
#include <utility>
namespace std
{
template<typename First, typename... Tail>
struct hash<std::tuple<First, Tail...>>
{
typedef size_t result_type;
typedef std::tuple<First, Tail...> argument_type;
result_type operator()(argument_type const& e) const
{
std::hash<First> left;
std::hash<std::tuple<Tail...>> right;
return left(std::get<0>(e))^right(???);
}
};
template<>
struct hash<std::tuple<>>
{
typedef size_t result_type;
typedef std::tuple<> argument_type;
result_type operator()(argument_type const& e) const
{
return 1;
}
};
}
Il mio test: 'int main() {std :: tuple t1 (42, 'e', 16.7); std :: tupla t2 = tail (t1); std :: cout << std::get<0> (t2) << std :: endl; } 'non riesce a compilare:' errore: impossibile chiamare la funzione membro 'std :: tupla tail_impl , N ...> :: vai (const std :: tuple &) [con T = int, Args = {char, double}, unsigned int ... N = {0u}] 'without object' –
Scusa, ci sono stati alcuni errori. Risolto ora. –