2016-03-20 37 views
1

私の目標は、異なる値を返す関数またはファンクタを作成することです。ユースケースは、Jsonオブジェクトを正しいC++型に変換することです。ほとんどの場合、私はこの作業をしていますが、私はstd::vectorstd::arrayのようなコンテナの問題にぶち当たっています。別の値の型を返す関数をオーバーロードできないので、structをテンプレートの特殊化とともに使用しています。私は、これを達成するために部分的なテンプレートの特殊化を使用する必要があると考えましたが、私はコンパイルエラーに陥っています。STLコンテナによる部分C++テンプレートの特殊化

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

が良く行うことができる使用していますことは注目に値しますより良い方法があれば。

ありがとうございます!だから、この行の

答えて

2

vector.push_back(from_json(obj)); 

from_jsonあなたのコードでは、定義されたoperator()とクラステンプレートです。これは関数または関数オブジェクトではありません(その意味では、std::hashのようなものです)。だからを呼び出すことはできません - あなたはそれのインスタンス化を呼び出す必要があります。

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

うわーええ、私は完全にインスタンスの事で台無し:あなたは範囲-V3にしている場合、または

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

私はあなたのような何かを意味推測しています。提案したようにインスタンス化するために '{}'を追加するのを忘れました。それを指摘してくれてありがとう! –

関連する問題