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 回答