string_view
operator+
vs. StrCat()
absl::Status
std::bind
absl::optional
and std::unique_ptr
absl::StrFormat()
make_unique
and private
Constructors.bool
explicit
= delete
)switch
Statements Responsibly= delete
AbslHashValue
and Youcontains()
std::optional
parametersif
and switch
statements with initializersinline
Variablesstd::unique_ptr
Must Be MovedAbslStringify()
vector.at()
auto
for Variable DeclarationsAbslHashValue
and YouOriginally posted as TotW #152 on June 21, 2018
Updated 2020-04-06
Quicklink: abseil.io/tips/152
I love Mozart, but I often make a terrible hash of it. – Simon Rattle
The absl::Hash
framework [https://abseil.io/docs/cpp/guides/hash] is now the
default hash implementation for the Swisstable family of hash tables
(absl::{flat,node}_hash_{set,map}
). All types hashable by this framework will
automatically be useable as keys in Swisstables.
Let’s say we have a simple Song
struct (let’s agree that a song can be
uniquely identified by these fields):
struct Song { std::string name; std::string artist; absl::Duration duration; };
and we want to be able to store an absl::flat_hash_set<Song>
or an
absl::flat_hash_map<Song, CopyrightOwner>
. All we have to do is add a simple
friend function like:
struct Song { std::string name; std::string artist; absl::Duration duration; template <typename H> friend H AbslHashValue(H h, const Song& s) { return H::combine(std::move(h), s.name, s.artist, s.duration); } // Include your implementation of operator == and != here };
and everything will work!
We provide absl::VerifyTypeImplementsAbslHashCorrectly
to verify that a type
implements its overload correctly. This function has a few requirements:
The type must implement the ==
operator correctly.
The caller must provide instances of the type that include any interesting representations for their type. (For example, a type with a small size optimization should include equivalent instances that use the small size optimization and that do not.)
TEST(MyType, SupportsAbslHash) { EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({ MyType(), MyType(1, 2), MyType(2, 3), MyType(0, 0), })); }
absl::VerifyTypeImplementsAbslHashCorrectly
also supports testing heterogenous
lookup and custom equality operators.
Intrigued and want to know more? Read up at https://abseil.io/docs/cpp/guides/hash.