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

标签 c++ c++11 templates

我正在使用 nlohmann::json 来解析 json 字符串。我实现了一个实用函数 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() 函数看起来很难看。执行此操作的优雅方法是什么?

最佳答案

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

关于c++ - 如何根据模板类型参数调用不同的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700343/

相关文章:

c++ - 获取特定监视器的处理程序以放置弹出窗口

c++ - 如何在 c++ "XY:56:21AM"中从这个字符串中分离出 HH、MM、SS 和 merdian?以下程序出现段错误

c++ - 为什么没有 std::move 就不会调用 move 构造函数?

c++ - 以列表作为值初始化 map

c++ - 为什么 C++ 中的模板 mixin 不再是主流?

c++ - 在 C++ 中从 double 到 float 的转换

c++ - 在启用 ARC 的情况下使用 reinterpret_cast

c++ - 支持按值传递语句的示例即使对于小型用户定义类型也不是好的做法

c++ - 如何为任意(但在编译时定义)功能支持定义抽象基类?

c++ - 使用 STL 容器的部分 C++ 模板特化