Add Visit method to ParameterizedMember

This is done despite the continued existence of std::monostate in the
underlying std::variant because it is infeasible to remove the default
constructor as long as Dictionary has its operator[](absl::string_view)
method, and in any case, Visit will still work even if std::monostate is
removed.

PiperOrigin-RevId: 986809570
diff --git a/quiche/common/structured_headers.cc b/quiche/common/structured_headers.cc
index 7567388..bc7f54c 100644
--- a/quiche/common/structured_headers.cc
+++ b/quiche/common/structured_headers.cc
@@ -730,16 +730,14 @@
   [[nodiscard]] bool WriteParameterizedMember(
       const ParameterizedMember& value) {
     // Serializes a parameterized member ([RFC8941] 4.1.1).
-    return std::visit(
-        absl::Overload{
-            [&](const ParameterizedItem& value) { return WriteItem(value); },
-            [&](const InnerList& value) { return WriteInnerList(value); },
-            [](std::monostate) {
-              QUICHE_CHECK(false);
-              return false;
-            },
+    return value.Visit(absl::Overload{
+        [&](const ParameterizedItem& value) { return WriteItem(value); },
+        [&](const InnerList& value) { return WriteInnerList(value); },
+        [](std::monostate) {
+          QUICHE_CHECK(false);
+          return false;
         },
-        value.value_);
+    });
   }
 
   [[nodiscard]] bool WriteInnerList(const InnerList& value) {
@@ -963,12 +961,8 @@
   return std::get_if<InnerList>(&value_);
 }
 
-// Not defaulted to work around
-// https://github.com/llvm/llvm-project/issues/132249 in older Clang versions.
-bool operator==(const ParameterizedMember& lhs,
-                const ParameterizedMember& rhs) {
-  return lhs.value_ == rhs.value_;
-}
+bool operator==(const ParameterizedMember&,
+                const ParameterizedMember&) = default;
 
 ParameterisedIdentifier::ParameterisedIdentifier() = default;
 ParameterisedIdentifier::ParameterisedIdentifier(
diff --git a/quiche/common/structured_headers.h b/quiche/common/structured_headers.h
index f8503c4..8e88eb7 100644
--- a/quiche/common/structured_headers.h
+++ b/quiche/common/structured_headers.h
@@ -308,6 +308,16 @@
   const InnerList* GetIfInnerList() const ABSL_ATTRIBUTE_LIFETIME_BOUND;
   InnerList* GetIfInnerList() ABSL_ATTRIBUTE_LIFETIME_BOUND;
 
+  template <typename Visitor>
+  auto Visit(Visitor&& visitor) const {
+    return std::visit(std::forward<Visitor>(visitor), value_);
+  }
+
+  template <typename Visitor>
+  auto Visit(Visitor&& visitor) {
+    return std::visit(std::forward<Visitor>(visitor), value_);
+  }
+
   QUICHE_EXPORT friend bool operator==(const ParameterizedMember&,
                                        const ParameterizedMember&);
 
@@ -320,10 +330,6 @@
   ParameterizedMember();
 
  private:
-  friend class StructuredHeaderSerializer;
-
-  // TODO(apaseltiner): Remove `std::monostate` once all uses of the default
-  // constructor are gone, and then add a public `Visit` method.
   std::variant<std::monostate, ParameterizedItem, InnerList> value_;
 };