簡體   English   中英

具有STL容器的部分C ++模板專業化

[英]Partial C++ Template Specialization with STL containers

因此,我的目標是創建一個可以返回不同值的函數或函子。 用例是將Json對象轉換為正確的C ++類型。 在大多數情況下,我可以正常工作,但是我遇到了諸如std::vectorstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM