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;
    }
};

}

questionAnswers(6)

yourAnswerToTheQuestion