与えられた
template<typename First, typename... Tail>
struct something
{
std::tuple<First, Tail...> t;
};
std::tuple<Tail...>
最初の要素を除くすべての要素を含むを取得するにはどうすればよいt
ですか?
これは一般的に興味深い質問だと思いますが、文脈に対する私の動機は次のとおりです。
タプルのハッシュを実装したいと思います。私はこの答えを基礎として使用しました。エラーがあることがわかりました。つまりoperator()
、値を指定してハッシュ オブジェクトを呼び出していません。
return left() ^ right();
次のようにする必要があります。
return left(std::get<0>(e)) ^ right(???);
??? テンプレートの再帰的なインスタンス化を続行するには、タプルの残りの要素になります。終了部分を含む完全なコードは次のとおりです。
#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;
}
};
}