[英]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.