我想声明一个带有一对迭代器和一个标准的算法。然后它返回满足标准的迭代器范围内的项向量。
template <typename TIterator, typename TCriterium>
std::vector< Type that I will get after dereferencing TIterator >
filter (TIterator begin, TIterator end, TCriterium passes);
我可以使用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;
}
但这不起作用。我明白了:
/usr/include/c++/4.7/ext/new_allocator.h:59:
error: forming pointer to reference type 'int*&'
答案 0 :(得分: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 >
{
}
答案 1 :(得分:2)
*begin
是一个引用,因此您需要删除它:
-> std::vector< std::remove_reference<decltype(*vector)>::type >
虽然在阅读了其他答案之后,我可能更喜欢在这里使用iterator_traits
。
答案 2 :(得分:1)
您可以查看std::remove_reference和type_traits标题来操作类型
答案 3 :(得分:1)
使用std::vector<typename std::iterator_traits<TIterator>::value_type>
或std::vector<typename std::decay<decltype(*begin)>::type>
。我更喜欢前者。
答案 4 :(得分: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>