gpt4 book ai didi

c++ - 如何将迭代器限制为前向迭代器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:51 24 4
gpt4 key购买 nike

我有一个函数需要多次枚举一个迭代器,但是according to MSDN , “一旦您递增输入迭代器的任何拷贝,此后就无法安全地比较、取消引用或递增任何其他拷贝。”

因此,为了让事情变得更简单,我不想为复制数据并枚举拷贝的非前向迭代器创建单独的实现,而是想将我的方法限制为仅接受前向迭代器,并静态拒绝输入迭代器。

现在我有这样的东西:

template<typename It, typename TCallback /*signature: bool(value_type)*/>
bool EnumerateTwice(const It &begin, const It &end, TCallback callback)
{
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
for (It it = begin; it != end; ++it)
if (!callback(*it))
return false;
return true;
}

但没有什么限制 It 成为前向迭代器。

我如何对模板函数施加限制? (C++03)

最佳答案

您可以使用 SFINAE 并将 bool 替换为:

typename enable_if<
is_same<typename std::iterator_traits<It>::iterator_category,
std::forward_iterator_tag>::value,
bool>::type

如果您不想从 Boost 或 TR1 中提取它们,您可能需要自己定义 is_sameenable_if:

template <typename A, typename B>
struct is_same { static const bool value = false; };

template <typename T>
struct is_same<T, T> { static const bool value = true; };

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

关于c++ - 如何将迭代器限制为前向迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8751460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com