繁体   English   中英

具有STL容器的部分C ++模板专业化

[英]Partial C++ Template Specialization with STL containers

因此,我的目标是创建一个可以返回不同值的函数或函子。 用例是将Json对象转换为正确的C ++类型。 在大多数情况下,我可以正常工作,但是我遇到了诸如std::vectorstd::array容器问题。 我知道您不能重载函数以仅返回不同的值类型,所以我一直在使用带有模板专门化的struct 我认为我需要使用部分模板专门化来实现此目的,但是我遇到了编译错误。 这是我的代码:

template <typename T>
struct from_json
{
    T operator()(const Json::Value &json)
    {
        return T::fromJson(json);
    }
};

template <>
struct from_json<std::string>
{
    std::string operator()(const Json::Value &json)
    {
        return std::string(json.asCString());
    }
};

template <typename T>
struct from_json<std::vector<T> >
{
    std::vector<T> operator()(const Json::Value &json)
    {
        std::vector<T> vector;

        for (auto obj : json)
            vector.push_back(from_json(obj));

        return vector;
    }
};

关于代码片段的一些注释:我有一个抽象类,它要求fromJson由我自己的可序列化类实现,这就是一般情况。 std::string泛化似乎工作正常。 std::vector是发生问题的地方。 编译器意识到这是应该使用的专业化,但是在尝试实际使用它时却给出了错误。

std::vector<std::string> my_vector = from_json<std::vector<std::string> >(json["my_vector"]);

编译器错误如下:

error: no matching function for call to 'from_json<std::vector<std::__cxx11::basic_string<char> > >::from_json(const Json::Value&)'
std::vector<std::string> my_vector = from_json<std::vector<std::string> >(json["my_vector"]);
note: candidate: constexpr from_json<std::vector<std::__cxx11::basic_string<char> > >::from_json()

还值得注意的是,我正在使用C ++ 11。

我绝对愿意提出建议,如果有更好的方法可以做得更好。

谢谢!

所以在这一行:

vector.push_back(from_json(obj));

代码中的from_json是带有定义的operator()的类模板。 它不是函数或函数对象(从某种意义上说,它有点像std::hash )。 所以您不能调用它-您需要调用它的实例化。

我猜你的意思是这样的:

vector.push_back(from_json<T>{}(obj));

或者,如果您属于range-v3:

std::vector<T> operator()(const Json::Value &json)
{
    return json | view::transform(from_json<T>{});
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM