blob: 925a4639f73c4632c0a4d48aab0f1fc84b76e145 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IPCZ_SRC_UTIL_OVERLOADED_H_
#define IPCZ_SRC_UTIL_OVERLOADED_H_
namespace ipcz {
// Overloaded is a template helper for more succint evaluation of absl::variant
// values. This allows visitation to be expressed with anonymous lambdas as
// follows:
//
// absl::variant<A, B, C> v = MakeSomeVariant();
// absl::visit(
// Overloaded{
// [](const A& v) { return "A"; },
// [](const B& v) { return "B"; },
// [](const C& v) { return "C"; },
// }, v);
//
// Usage requires an expicit case for every possible alternative held by the
// variant.
template <typename... Callables>
struct Overloaded : Callables... {
using Callables::operator()...;
};
// A deduction guide which allows anonymous lambda types to be deduced from
// constructor arguments.
template <typename... Callables>
Overloaded(Callables...) -> Overloaded<Callables...>;
} // namespace ipcz
#endif // IPCZ_SRC_UTIL_OVERLOADED_H_