Как вызвать разные функции в соответствии с параметром типа шаблона? - PullRequest
1 голос
/ 21 июня 2019

Я использую nlohmann::json для анализа строки JSON. Я реализую функцию util GetValue() для извлечения полей объекта.

template<typename T1, typename T2>
bool CheckType(T1& it, T2& val) { return false; }

template<typename T1>
bool CheckType(T1& it, bool& val) { return it->is_boolean(); }

template<typename T1>
bool CheckType(T1& it, std::string& val) { return it->is_string(); }

....

template<typename T>
bool GetValue(nlohmann::json obj, std::string key, T& value, std::string &err) {
    auto it = obj.find(key);
    if (it != obj.end()) {
        if (CheckType(it, val)) {
            value = it->get<T>();
            return true;
        } else {
            err = key + " type error";
        }
    } else {
        err = key + " not found";
    }
    return false;
}

Функция CheckType() выглядит некрасиво. Какой элегантный способ сделать это?

1 Ответ

1 голос
/ 21 июня 2019

Не уверен, но, если get() поддерживает метание в случае плохого типа, мне кажется, проще написать что-то как

template<typename T>
bool GetValue(nlohmann::json obj, std::string key, T& value, std::string &err) {
    auto it = obj.find(key);
    if (it != obj.end()) {
       try {
          value = it->get<T>();
          return true;
       }
       catch (...) { // catching the correct exception; see library documentation
           err = key + " type error";
       }
    } else
        err = key + " not found";

    return false;
}

полностью избегая функций CheckType().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...