Я работаю над форматом JSON, используя ‹C ++ 98›, и по этой причине я определил 3 класса:
class Json {
public:
string key;
};
class JsonElement:public Json {
public:
string value;
}
class JsonObject: public Json {
public:
std::vector<Json*> elements;
На данный момент я не обращал внимания на JsonList.
Я перегрузил operator[]
, так что если оператор найдет другой JsonObject
, он снова вызовет operator[]
, пока не найдет JsonElement
, и здесь он вернет значение, а не Json
Я не знаю, смогу ли я использовать enable_if
для этого, или, может быть, у вас есть другое решение.
идея такая: (это не код, просто идея)
Json || string operator[](const char* key){
if(this->getElementByKey(key) is JsonObject)
return Json;
else if(this->getElementByKey(key) is JsonElement))
return this->getElementByKey(key)->value;
}
таким образом мы можем использовать, например:
JsonObject jObj;
string value = jObj["key1"]["key2"]
Json
и, возможно, возвращаетstring
в зависимости от фактического значения переданного ему аргумента. - person Nathan Pierson   schedule 06.05.2021this->
. - person tadman   schedule 06.05.2021enable_if
- person Gismail   schedule 06.05.2021Json
может иметьoperator std::string
для окончательного преобразования. - person Jarod42   schedule 06.05.2021enable_if
- это инструмент времени компиляции, и, по сути, вам придется выполнять это разрешение перегрузки во время выполнения. Если мой JSON выглядит как{"Key1": {"NestedKey": "NestedValue"}, "Key2": "FlatValue"}
, невозможно указать во время компиляции, следует ли вызыватьstring
версиюoperator[]
илиJSON
версиюoperator[]
, потому что"Key1"
и"Key2"
относятся к одному типу. - person Nathan Pierson   schedule 06.05.2021doc["sensor"]
наconst char*
, означает, что он преобразует возвращаемое значение, вместо того, чтобы фактически возвращать что-то отличное отoperator[]
. - person Nathan Pierson   schedule 06.05.2021