将boost::optional与boost::adapter::indirected一起使用

Use boost::optional together with boost::adaptors::indirected

本文关键字:boost 一起 indirected optional adapter      更新时间:2023-10-16

我正在尝试编译以下代码:

#include <iostream>
#include <iterator>
#include <vector>
#include <boost/assign/std/vector.hpp>
#include <boost/optional.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/copy.hpp>
int main( int argc, char ** argv )
{
  using namespace boost::assign;
  using boost::adaptors::indirected;
  std::vector<boost::optional<unsigned> > values;
  values += 1u,2u,3u;
  boost::copy( values | indirected, std::ostream_iterator<unsigned>( std::cout, " " ) );
  std::cout << std::endl;
}

但是,我遇到了一些错误,例如boost::optional<unsigned>中没有名为element_type的类型。然而,参考页面上说,唯一的前提条件是operator*()一元函数的存在。有办法让它发挥作用吗?

这肯定是Boost中的一个错误,但这个错误是在Boost.Optional还是Boost.Iterator中还有待讨论(我个人认为是后者)。

然而,修复是微不足道的——在包含任何Boost标头之前,请执行以下操作:

#include <boost/optional/optional_fwd.hpp>
#include <boost/pointee.hpp>
namespace boost
{
    template<typename P>
    struct pointee<optional<P> >
    {
        typedef typename optional<P>::value_type type;
    };
}

然后根据需要包括其他Boost标头。

请在Boost-Trac上提交票证,或者至少在Boost-Users邮件列表上发布错误报告。

查看boost iostreams库中定义的private optional.hpp。您将看到它定义了typedef T element_type;

然而,您在这里定义的实际optional.hpp并没有定义它。所以这就是编译器抱怨的原因。我不知道为什么它被忽视了。

请尝试使用iostreams库中的private选项.hpp来解决此问题。我希望这能有所帮助。