我有一个模板函数,它采用以下形式:
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()
,我希望true
返回Output
,但是我收到编译错误(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值?
答案 0 :(得分:4)
编写一个包装器迭代器,它将分隔到另一个迭代器,您可以从插入迭代器构造它。然后,您的代理人可以在modified
方法中将operator=
成员设置为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; }
};
答案 1 :(得分:1)
OutputIterators不允许这样做。但在你的情况下,是什么阻止你返回Input1 != Input2
?
答案 2 :(得分:1)
您至少有以下两个选项:
inserter
,它将一个额外的布尔引用参数作为参数,如果cont.insert (...).second
为真,则设置为true。如果尺寸成本不是O(1),则第二个选项具有潜在的性能考虑因素。