[英]Partial C++ Template Specialization with STL containers
因此,我的目标是创建一个可以返回不同值的函数或函子。 用例是将Json对象转换为正确的C ++类型。 在大多数情况下,我可以正常工作,但是我遇到了诸如std::vector
和std::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.