我想编写一个模板函数,它将一些STL容器的两个迭代器First和Last作为其参数,并返回一个STL容器,其中包含符合某些条件的两个迭代器之间的那些元素(的副本)。换句话说,我想要这样的东西:
template <typename Type>
Type Foo(Type::iterator First, Type::iterator Last)
{
Type Result;
for (Type::iterator i = First; i != Last; i++)
{
if (...)
{
Result.push_back(*i);
}
}
return Result;
}
然而,这不会编译,因为编译器说“Type::iterator
不是类型”(我用std::vector<double>
称呼它)。
我只是简单地弄错了语法?或者我完全以错误的方式做这件事?
谢谢。
答案 0 :(得分:3)
使用:
template <typename Type>
Type Foo(typename Type::iterator First, typename Type::iterator Last)
你无法推断Type
(并且可能有多种可能性)
(你必须这样称呼Foo<Container>(first, last)
)
你可以创建一个类型特征来完成这项工作; 类似的东西:
template <typename T> struct get_container;
template <typename T*>
struct get_container<T*>
{
typedef std::vector<T> type;
};
template <typename T>
struct get_container<std::list<T>::iterator>
{
typedef std::list<T> type;
};
// And so on: care of possible conflict.
然后你有:
template <typename It>
typename get_container<It>::type Foo(It First, It Last)
{
typename get_container<It>::type Result;
for (It it = First; it != Last; ++it) {
if (...) {
Result.push_back(*it);
}
}
return Result;
}
答案 1 :(得分:1)
尝试使用
typename Type::iterator
答案 2 :(得分:1)
template <typename Container, typename InputIterator>
Container Foo(InputIterator First, InputIterator Last)
{
using namespace std;
Container Result;
copy_if(First,Last, back_inserter(Result),pred)
return Result;
}