diff options
Diffstat (limited to 'absl/strings')
-rw-r--r-- | absl/strings/str_cat.h | 12 | ||||
-rw-r--r-- | absl/strings/str_cat_test.cc | 13 |
2 files changed, 25 insertions, 0 deletions
diff --git a/absl/strings/str_cat.h b/absl/strings/str_cat.h index cba8ceb024ae..559ee0aa5294 100644 --- a/absl/strings/str_cat.h +++ b/absl/strings/str_cat.h @@ -56,6 +56,7 @@ #include <cstdint> #include <string> #include <type_traits> +#include <vector> #include "absl/base/port.h" #include "absl/strings/numbers.h" @@ -268,6 +269,17 @@ class AlphaNum { AlphaNum(T e) // NOLINT(runtime/explicit) : AlphaNum(static_cast<typename std::underlying_type<T>::type>(e)) {} + // vector<bool>::reference and const_reference require special help to + // convert to `AlphaNum` because it requires two user defined conversions. + template < + typename T, + typename std::enable_if< + std::is_class<T>::value && + (std::is_same<T, std::vector<bool>::reference>::value || + std::is_same<T, std::vector<bool>::const_reference>::value)>::type* = + nullptr> + AlphaNum(T e) : AlphaNum(static_cast<bool>(e)) {} // NOLINT(runtime/explicit) + private: absl::string_view piece_; char digits_[numbers_internal::kFastToBufferSize]; diff --git a/absl/strings/str_cat_test.cc b/absl/strings/str_cat_test.cc index beb15fa9371b..1f1051d41f1e 100644 --- a/absl/strings/str_cat_test.cc +++ b/absl/strings/str_cat_test.cc @@ -18,6 +18,7 @@ #include <cstdint> #include <string> +#include <vector> #include "gtest/gtest.h" #include "absl/strings/substitute.h" @@ -395,6 +396,18 @@ TEST(StrAppend, Basics) { "No limit thanks to C++11's variadic templates"); } +TEST(StrCat, VectorBoolReferenceTypes) { + std::vector<bool> v; + v.push_back(true); + v.push_back(false); + std::vector<bool> const& cv = v; + // Test that vector<bool>::reference and vector<bool>::const_reference + // are handled as if the were really bool types and not the proxy types + // they really are. + std::string result = absl::StrCat(v[0], v[1], cv[0], cv[1]); // NOLINT + EXPECT_EQ(result, "1010"); +} + #ifdef GTEST_HAS_DEATH_TEST TEST(StrAppend, Death) { std::string s = "self"; |