Jak podzielić krotkę?
Dawać
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
Jak mogę dostaćstd::tuple<Tail...>
który zawiera wszystkie elementy zt
z wyjątkiem pierwszego?
Myślę, że jest to interesujące pytanie w ogóle, ale oto moja motywacja do kontekstu:
Chciałbym zaimplementować skrót dla krotek. użyłemta odpowiedź jako podstawa. Odkryłem, że w tym był błąd, a mianowicie nie dzwonienieoperator()
obiektu haszującego o wartości:
return left() ^ right();
Powinno być:
return left(std::get<0>(e)) ^ right(???);
The ??? pozostałymi elementami krotki będzie kontynuacja rekursywnej instancji szablonu. Oto pełny kod zawierający część zakończenia:
#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;
}
};
}