在解除引用时构造新对象的迭代器

时间:2014-04-16 16:45:21

标签: c++11 iterator

我有一个Visual Studio 2013 C ++ 11项目,我试图定义一个迭代器。我希望迭代器取消引用一个对象,但在内部它实际上迭代了对象构造所需的一些内部数据。

class my_obj
{
public:
    my_obj(some_internal_initialization_value_ v);

    std::wstring friendly_name() const;
    // ...
};

class my_iterator 
    : public boost::iterator_facade<
        my_iterator,
        my_obj,
        boost::forward_traversal_tag>
{
    // ...
private:
    my_obj& dereference() const
    {
        // warning C4172: returning address of local variable or temporary
        return my_obj(some_internal_initialization_value_);
    }
};

int main( int argc, char* argv[])
{
    my_container c;
    for (auto o = c.begin(); o != c.end(); ++o)
        printf( "%s\n", o->friendly_name().c_str() );
}

这些内部值对用户来说是不重要的实现细节,我不想暴露它们。如何编写正确执行此操作的迭代器?另一种方法是我必须做这样的事情:

my_container c;
for (auto i = c.begin(); i != c.end(); ++i)
{
    my_obj o(*i);
    printf( "%s\n", o.friendly_name().c_str() );
}

1 个答案:

答案 0 :(得分:0)

在iterator_facade的boost页面中,模板参数为:derived iterator,value_type,category, reference type ,difference_type。 Ergo,只是告诉它引用不是引用

class my_iterator 
    : public boost::iterator_facade<
        my_iterator,
        my_obj,
        boost::forward_traversal_tag,
        my_obj> //dereference returns "my_obj" not "my_obj&"

在此处查看:http://coliru.stacked-crooked.com/a/4b09ddc37068368b