如何声明这个算法?

Mar*_*dik 2 c++ templates c++11

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

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

我可以使用C++ 11等功能,例如decltype或auto.我试过了:

#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;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我明白了:

/usr/include/c++/4.7/ext/new_allocator.h:59: 
error: forming pointer to reference type 'int*&'
Run Code Online (Sandbox Code Playgroud)

And*_*owl 6

你可以使用:

std::vector<typename std::iterator_traits<TIterator>::value_type>
Run Code Online (Sandbox Code Playgroud)

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

#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...
}
Run Code Online (Sandbox Code Playgroud)

如果你想走的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 >
{
}
Run Code Online (Sandbox Code Playgroud)

  • 但是如果`TIterator`是一个真正的指针(`int*`),那将会失败.那么使用`std :: iterator_traits <TIterator> :: value_type`呢? (2认同)