Fixed invalid conversion in operator|(Variant, char*) (fixes #1432)

This commit is contained in:
Benoit Blanchon
2020-11-09 09:13:12 +01:00
parent bcdf5b7e52
commit 30da920135
3 changed files with 30 additions and 3 deletions

View File

@ -1,6 +1,11 @@
ArduinoJson: change log ArduinoJson: change log
======================= =======================
HEAD
----
* Fixed invalid conversion error in `operator|(JsonVariant, char*)` (issue #1432)
v6.17.1 (2020-11-07) v6.17.1 (2020-11-07)
------- -------

View File

@ -137,6 +137,20 @@ TEST_CASE("JsonVariant::operator|()") {
REQUIRE(result == "not default"); REQUIRE(result == "not default");
} }
SECTION("const char* | char*") {
char dflt[] = "default";
variant.set("not default");
std::string result = variant | dflt;
REQUIRE(result == "not default");
}
SECTION("int | char*") {
char dflt[] = "default";
variant.set(42);
std::string result = variant | dflt;
REQUIRE(result == "default");
}
SECTION("const char* | int") { SECTION("const char* | int") {
variant.set("not default"); variant.set("not default");
int result = variant | 42; int result = variant | 42;

View File

@ -19,15 +19,23 @@ CompareResult compare(const T1 &lhs, const T2 &rhs); // VariantCompare.cpp
template <typename TVariant> template <typename TVariant>
struct VariantOperators { struct VariantOperators {
// Returns the default value if the VariantRef is undefined or incompatible // Returns the default value if the VariantRef is undefined or incompatible
//
// int operator|(JsonVariant, int)
// float operator|(JsonVariant, float)
// bool operator|(JsonVariant, bool)
// const char* operator|(JsonVariant, const char*)
// char* operator|(JsonVariant, const char*)
template <typename T> template <typename T>
friend typename enable_if<!IsVariant<T>::value, T>::type operator|( friend typename enable_if<!IsVariant<T>::value,
const TVariant &variant, T defaultValue) { typename VariantAs<T>::type>::type
operator|(const TVariant &variant, T defaultValue) {
if (variant.template is<T>()) if (variant.template is<T>())
return variant.template as<T>(); return variant.template as<T>();
else else
return defaultValue; return defaultValue;
} }
// Returns the default value if the VariantRef is undefined or incompatible //
// JsonVariant operator|(JsonVariant, JsonVariant)
template <typename T> template <typename T>
friend typename enable_if<IsVariant<T>::value, typename T::variant_type>::type friend typename enable_if<IsVariant<T>::value, typename T::variant_type>::type
operator|(const TVariant &variant, T defaultValue) { operator|(const TVariant &variant, T defaultValue) {