首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在特定类型元素的任何容器上使用STL迭代器的函数

在特定类型元素的任何容器上使用STL迭代器的函数
EN

Stack Overflow用户
提问于 2010-12-05 01:03:01
回答 5查看 6.1K关注 0票数 19

我如何定义一个函数,该函数接受任何类型的STL容器的迭代器作为输入,但仅限于特定的模板化类型的容器。例如:

std::list<Unit*>::iterator std::vector<Unit*>::iterator形式的任何迭代器

我只是将函数定义为使用std::list<Unit*>::iterator,但是如果我们切换到不同的STL容器,我不想更改我的代码。

有没有办法通过模板或其他方式做到这一点?

EN

回答 5

Stack Overflow用户

发布于 2010-12-05 01:12:55

您可以使用诸如boost::enable_if之类的SFINAE构造来验证嵌套的类型定义iterator::value_type是否确实属于适当的类型。

代码语言:javascript
复制
template<class T, class Iterator>
typename boost::enable_if<boost::is_same<typename Iterator::value_type, T> >::type
    f(Iterator i)
{
    /* ... */
}

int main()
{
    std::list<int> l;
    std::vector<int> v;

    f<int>(l.begin()); // OK
    f<int>(v.begin()); // OK

    std::vector<float> v2;
    f<int>(v2.begin()); /* Illegal */
}

这是我从“接受任何类型STL容器的迭代器作为输入的函数,但只接受特定模板类型的迭代器的函数”中理解的,但我的解释可能是错误的。

票数 16
EN

Stack Overflow用户

发布于 2010-12-05 01:26:42

除了依赖于SFINAE的现有答案之外,一种更简单的近似方法是简单地定义函数,将任意模板类型作为迭代器:

代码语言:javascript
复制
template <typename Iter>
void function(Iter first, Iter last){
  Unit* val = *first;
}

这有一些缺点。与SFINAE解决方案(如boost::enable_if)不同的是,它不能完全满足您的要求。只要Iter类型的对象可以被解引用并产生一个可转换为Unit*的值,就会进行编译,但这并不是一回事。您不能保证Iter是一个完全符合STL的迭代器(它可能只是另一个定义operator*的类型),或者它的值类型是Unit*

另一方面,它要简单得多。

票数 15
EN

Stack Overflow用户

发布于 2010-12-05 01:13:45

你只想迭代my_special_type的容器吗?在这种情况下:

代码语言:javascript
复制
template <bool, typename T>
struct enable_if;

template <typename T>
struct enable_if<true, T>
{
    typedef T type;
};

template <typename T, typename U>
struct is_same
{
    enum {value = false};
};

template <typename T>
struct is_same<T, T>
{
    enum {value = true};
};

template <typename Iter>
typename enable_if<is_same<typename Iter::value_type, your_special_type>::value,
                  void>::type
function(Iter begin, Iter end)
{
    // ...
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4354665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档