Meh*_*dad 6 c++ templates iterator
我有一个需要多次枚举迭代器的函数,但根据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;
}
Run Code Online (Sandbox Code Playgroud)
但没有什么限制It成为一个前向迭代器.
如何将限制放在模板化函数上?(C++ 03)
您可以使用SFINAE并替换bool为:
typename enable_if<
is_same<typename std::iterator_traits<It>::iterator_category,
std::forward_iterator_tag>::value,
bool>::type
Run Code Online (Sandbox Code Playgroud)
如果您不想从Boost或TR1中提取它们,您可能需要定义is_same和enable_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; };
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1042 次 |
| 最近记录: |