1

std::vector別のコンテナにイテレータを作成する次の関数があります。

template <typename T,
          template <typename, typename = std::allocator<T>> class Con>
std::vector<typename Con<T>::iterator> make_itervec(Con<T>& v)
{
    std::vector<typename Con<T>::iterator> itervec;
    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }
    return itervec;
}

私がしたいのはこれです:

template <typename T,
          template <typename, typename = std::allocator<T>> class Con>
auto make_itervec(Con<T>& v) -> decltype(x) // This line
{
    std::vector<typename Con<T>::iterator> itervec;
    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }
    return itervec;
}

これを機能させるために何をすればよいxですか?

試行したが失敗した試行:

decltype(std::vector<typename Con<T>::iterator>)
decltype(std::vector<decltype(v)::iterator>)

(また、私はこれに関する専門家ではないので、他の提案、コメントを歓迎します!ありがとう。)

4

2 に答える 2

3

私はあなたがここで働きすぎていると思います。あなたがする必要があるのはこれだけです:

template <typename T>
std::vector<typename T::iterator> make_itervec(T& v)
{
    std::vector<typename T::iterator> itervec;

    for (auto i = v.begin(); i != v.end(); ++i)
    {
        itervec.push_back(i);
    }

    return itervec;
}
于 2012-04-10T23:44:43.087 に答える
3

std::vector<decltype(v)::iterator>またはを使用できますstd::vector<decltype(v.begin())>。の周りには何もない ことに注意してください。これは、変数や式ではなく、すでに型であるためです。式の型を取得するためだけに使用されます。decltypestd::vectordecltype

于 2012-04-10T23:47:39.687 に答える