2

我想声明一个采用一对迭代器和一个标准的算法。然后它返回满足条件的迭代器范围内的项目向量。

template <typename TIterator, typename TCriterium>
std::vector< Type that I will get after dereferencing TIterator >
filter (TIterator begin, TIterator end, TCriterium passes);

我可以使用 decltype 或 auto 等 C++11 功能。我试过:

#include <vector>

template <typename TIterator, typename TCriterium>
auto filter (TIterator begin, TIterator end, TCriterium passes) 
                      -> std::vector< decltype(*begin) >
{
}

int main()
{
    std::vector<int*> vector;
    filter(vector.begin(), vector.end(), 0);
    return 0;
}

但这不起作用。我得到:

/usr/include/c++/4.7/ext/new_allocator.h:59: 
error: forming pointer to reference type 'int*&'
4

5 回答 5

6

你可以使用:

std::vector<typename std::iterator_traits<TIterator>::value_type>

作为函数的返回类型,它将变为:

#include <vector>
#include <iterator>

// ...

template <typename TIterator, typename TCriterium>
std::vector<typename std::iterator_traits<TIterator>::value_type> filter(
    TIterator begin, TIterator end, TCriterium passes)
{
    // Body...
}

如果你想走这decltype条路,那么你可以这样做:

#include <vector>
#include <type_traits>

// ...

template <typename TIterator, typename TCriterium>
auto filter (TIterator begin, TIterator end, TCriterium passes)
    -> std::vector< typename std::decay<decltype(*begin)>::type >
{
}
于 2013-05-08T12:15:53.933 回答
2

*begin是一个参考,所以你需要删除它:

-> std::vector< std::remove_reference<decltype(*vector)>::type >

虽然,在阅读了其他答案后,我可能更喜欢在iterator_traits这里使用。

于 2013-05-08T12:17:48.787 回答
1

您可能会查看std::remove_reference和用于操作类型的 type_traits 标头

于 2013-05-08T12:16:16.967 回答
1

使用std::vector<typename std::iterator_traits<TIterator>::value_type>或可能std::vector<typename std::decay<decltype(*begin)>::type>。我更喜欢前者。

于 2013-05-08T12:16:49.537 回答
1

您可以使用std::iterator_traits获取迭代器使用的类型:

template <typename TIterator, typename TCriterium>
auto filter (TIterator begin, TIterator end, TCriterium passes) 
                  -> std::vector<std::iterator_traits<TIterator>::value_type>
于 2013-05-08T12:17:55.420 回答