![](/img/trans.png)
[英].NET: How to determine programmatically whether a .NET application has been compiled?
[英]How to determine whether output iterator has been modified
我有一个采用以下形式的模板函数:
template < class ITER1, class ITER2 >
bool example(ITER1 Input1, ITER1 Input2, ITER2 Output)
{
ITER2 OrigOutput(Output);
// ...
std::copy(Input1, Input2, Output);
return (OrigOutput != Output);
}
我这样调用example()
:
std::vector < int > Input;
std::set < int > Output;
if (example(Input.begin(), Input.end(), inserter(Output, Output.begin())))
{
...
}
我希望example()
如果将元素插入到Output
,则返回true
,但是我遇到了编译错误(msvc 2008):
Error 1 error C2678: binary '!=' : no operator found which takes a left-hand
operand of type 'std::insert_iterator<_Container>' (or there is no acceptable
conversion)
有没有一种方法可以确定是否将任何元素插入到输出迭代器中以返回正确的bool值?
编写一个包装迭代器,该迭代器将委派到另一个迭代器,您可以从插入迭代器构造该迭代器。 然后,您的委托人可以在operator=
方法中将modified
成员设置为true。
与此类似:
template<typename ITER>
class ModifiedIterator : public std::iterator<std::output_iterator_tag, void, void, void, void>
{
protected:
typedef ITER Iter;
Iter iter;
bool& isModified;
public:
explicit ModifiedIterator (Iter i, bool& isMod)
: iter(i), isModified (isMod)
{}
template<typename T>
ModifiedIterator& operator= (const T& value)
{
iter = value;
++iter;
isModified = true;
return *this;
}
ModifiedIterator& operator* () { return *this; }
ModifiedIterator& operator++ () { return *this; }
ModifiedIterator operator++ (int) { return *this; }
};
OutputIterators不允许这样做。 但是在您的情况下,是什么导致您无法返回Input1 != Input2
呢?
您至少具有以下两个选项:
inserter
,该版本inserter
将一个额外的布尔参考参数作为参数,如果cont.insert (...).second
为true,则将其设置为true。 如果大小成本不是O(1),则第二种选择具有潜在的性能考虑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.