如何根据模板类型参数调用不同的函数?

时间:2019-06-21 09:13:46

标签: c++ c++11 templates

我正在使用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 个答案:

答案 0 :(得分:1)

不确定,但是如果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()函数。