Оператор перегрузки [] с другим типом возврата

Я работаю над форматом 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"]


person Gismail    schedule 06.05.2021    source источник
comment
Тип возвращаемого значения функции должен быть известен во время компиляции. Вы не сможете написать что-то, что может возвращать Json и, возможно, возвращает string в зависимости от фактического значения переданного ему аргумента.   -  person Nathan Pierson    schedule 06.05.2021
comment
Даже в C ++ 98 (yikes) вам не нужно использовать this->.   -  person tadman    schedule 06.05.2021
comment
Вы должны выбрать один и только один возвращаемый тип. C ++ 98 скажет: «Разберись с этим». C ++ 17 говорит, что я понял.   -  person tadman    schedule 06.05.2021
comment
@NathanPierson, я знаю это, и поэтому я стараюсь перегружать оператор `` operator [] `` на enable_if   -  person Gismail    schedule 06.05.2021
comment
Почему бы не получить парсер JSON? Или посмотрите, как с этим справляются другие парсеры JSON на основе C ++?   -  person PaulMcKenzie    schedule 06.05.2021
comment
@PaulMcKenzie Не уверен, что они работают с технологиями 20-го века.   -  person tadman    schedule 06.05.2021
comment
Ваш Json может иметь operator std::string для окончательного преобразования.   -  person Jarod42    schedule 06.05.2021
comment
@Gismail И я говорю вам, что enable_if - это инструмент времени компиляции, и, по сути, вам придется выполнять это разрешение перегрузки во время выполнения. Если мой JSON выглядит как {"Key1": {"NestedKey": "NestedValue"}, "Key2": "FlatValue"}, невозможно указать во время компиляции, следует ли вызывать string версию operator[] или JSON версию operator[], потому что "Key1" и "Key2" относятся к одному типу.   -  person Nathan Pierson    schedule 06.05.2021
comment
@NathanPierson, я видел, как ArduinoJsonProject использовал эту ссылку, поэтому мне интересно, возможно ли это сделать что-то похожее.   -  person Gismail    schedule 06.05.2021
comment
Я не говорю, что одна функция должна возвращать разные типы, но, возможно, с разными функциями и разными условиями мы заставим компилятор выбрать правильную функцию.   -  person Gismail    schedule 06.05.2021
comment
Ну, я не знаю, как это делает Arduino JSON, но из примера я подозреваю, что его тип JSON имеет операторы преобразования, такие как предложил Джарод, где тот факт, что вы назначаете doc["sensor"] на const char*, означает, что он преобразует возвращаемое значение, вместо того, чтобы фактически возвращать что-то отличное от operator[].   -  person Nathan Pierson    schedule 06.05.2021