Amacım, farklı değerler döndüren bir işlev veya functor oluşturmaktır. Kullanım durumu, Json nesnelerini doğru C++ türüne dönüştürmektir. Çoğunlukla bu çalışmam var ama std::vector
ve std::array
gibi kapsayıcılarla ilgili sorunlara koşuyorum. Şablon özelliğiyle bir struct
kullanıyorum, böylece farklı değer türleri döndürmek için bir işlevi aşırı yükleyemezsiniz biliyorum. Bunu başarmak için kısmi şablon uzmanlığı kullanmam gerektiğini düşündüm ama derleme hatalarıyla karşılaşıyorum.Kısmi C++ Şablon İhtisas STL kapsayıcılarla
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;
}
};
kod parçacığı üzerinde bazı notlar: Ben genel durum hakkında; işte bu yüzden benim kendi seri hale getirilebilir sınıfları tarafından uygulanacak fromJson
gerektiren soyut bir sınıf var İşte benim kod böyle görünüyor. std::string
genelleştirmesi iyi çalışıyor gibi görünüyor. std::vector
, işlerin kesildiği yerdir. Derleyici, bunun kullanılması gereken uzmanlık olduğunu, ancak aslında onu kullanmaya çalışırken bir hata verdiğini kabul eder.
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.
daha iyi yapılabilirdi bu konuda önerilere kesinlikle açığım:
std::vector<std::string> my_vector = from_json<std::vector<std::string> >(json["my_vector"]);
derleyici hatası şudur daha iyi bir yol varsa.
Teşekkürler! Yani bu çizgide
Vay evet ben tamamen örnek şeye berbat: Eğer aralık-v3 içine konum Ya
:
ben gibi bir şey demek tahmin ediyorum. Önerdiğiniz gibi sunmak için '{}' öğesini eklemeyi unutmayın. Bunu işaret ettiğin için teşekkürler! –