gpt4 book ai didi

c++ - 比较模板函数中不同类型的两个迭代器

转载 作者:行者123 更新时间:2023-11-30 01:21:08 24 4
gpt4 key购买 nike

没有 C++11 或 Boost :(

我有一个具有以下签名的函数。

template<class INPUT_ITR, class OUTPUT_ITR>
void DoWork(const INPUT_ITR in_it, const INPUT_ITR in_it_end, OUTPUT_ITR out_it, OUTPUT_ITR out_it_end, CONTEXT_DATA)

通常一些复杂的处理发生在输入和输出之间。但有时需要一个空操作,并且数据被简单地复制。如果输入和输出数据类型相同,则该函数支持就地操作。所以我有这段代码。

    if (NoOp)
{
if (in_it != out_it)
{
copy(in_it, in_it_end, out_it);
}
}

如果已请求就地操作(迭代器检查),则无需复制任何数据。

在我调用带有不同数据类型(例如 int32 到 int64)的迭代器的函数之前,它一直运行良好。然后它提示迭代器检查,因为它们是不兼容的类型。

error C2679: binary '!=' : no operator found which takes a right-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<unsigned __int64>>>

这让我有点难过。如果数据类型相同,是否有一种简单的方法可以执行此检查,但如果它们是不同类型,则只需执行复制?

谢谢

最佳答案

您可以将测试提取到一对模板中;一种用于匹配类型,一种用于非匹配类型。

template <class T1, class T2>
bool same(T1 const &, T2 const &) {return false;}

template <class T>
bool same(T const & a, T const & b) {return a == b;}

请注意,当与您希望具有可比性的类型一起使用时,这可能会产生令人困惑的结果。在 C++11 中(或使用 Boost,或使用模板进行大量繁琐的处理),您可以扩展它以在可能的情况下比较不同的类型;但这超出了您在这里的需要。

另外,请注意,您依赖于形式上未定义的行为,因为不同底层序列上的迭代器不需要具有可比性。无法从迭代器本身判断是否是这种情况。

关于c++ - 比较模板函数中不同类型的两个迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18486902/

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