2016-03-20 20 views
1

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.

Ayrıca kullanıyorum dikkati çekiyor
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

cevap

2

:

vector.push_back(from_json(obj)); 

from_json Kodunuzdaki tanımlanmış operator() olan bir sınıf şablondur. Bu bir işlev ya da işlev nesnesi değil (bu anlamda, std::hash gibi). Yani, numaralı telefonu arayarak numaralı telefonu arayamazsınız - bunun bir örneğini çağırmanız gerekir.

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

Vay evet ben tamamen örnek şeye berbat: Eğer aralık-v3 içine konum Ya

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

:

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! –