indirect_iter_member_types.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 90 行

CPP
90
字号
//  (C) Copyright Jeremy Siek 2004.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//  Revision History//  03 Jan 2004   Jeremy Siek//       First draft.#include <boost/config.hpp>#include <iostream>#include <boost/iterator/indirect_iterator.hpp>#include <boost/static_assert.hpp>#include "static_assert_same.hpp"#include <boost/type_traits/same_traits.hpp>struct zow { };struct my_ptr {  typedef zow const element_type;  zow const& operator*() const;//  typedef const zow& reference;//  typedef const zow* pointer;//  typedef void difference_type;//  typedef boost::no_traversal_tag iterator_category;};BOOST_TT_BROKEN_COMPILER_SPEC(my_ptr)BOOST_TT_BROKEN_COMPILER_SPEC(zow)// Borland 5.6.4 and earlier drop const all over the place, so this// test will fail in the lines marked with (**)    int main(){  {    typedef boost::indirect_iterator<int**> Iter;    STATIC_ASSERT_SAME(Iter::value_type, int);    STATIC_ASSERT_SAME(Iter::reference, int&);      STATIC_ASSERT_SAME(Iter::pointer, int*);      STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t);        BOOST_STATIC_ASSERT((boost::is_convertible<Iter::iterator_category,             std::random_access_iterator_tag>::value));    BOOST_STATIC_ASSERT((boost::is_convertible<boost::iterator_traversal<Iter>::type,             boost::random_access_traversal_tag>::value));  }  {    typedef boost::indirect_iterator<int const**> Iter;    STATIC_ASSERT_SAME(Iter::value_type, int);    STATIC_ASSERT_SAME(Iter::reference, const int&);    STATIC_ASSERT_SAME(Iter::pointer, const int*);    // (**)  }  {    typedef boost::indirect_iterator<int**, int> Iter;    STATIC_ASSERT_SAME(Iter::value_type, int);    STATIC_ASSERT_SAME(Iter::reference, int&);      STATIC_ASSERT_SAME(Iter::pointer, int*);    }  {    typedef boost::indirect_iterator<int**, const int> Iter;    STATIC_ASSERT_SAME(Iter::value_type, int);    STATIC_ASSERT_SAME(Iter::reference, const int&);      STATIC_ASSERT_SAME(Iter::pointer, const int*);    // (**)  }  {    typedef boost::indirect_iterator<my_ptr*> Iter;    STATIC_ASSERT_SAME(Iter::value_type, zow);    STATIC_ASSERT_SAME(Iter::reference, const zow&);  // (**)    STATIC_ASSERT_SAME(Iter::pointer, const zow*);    // (**)        STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t);        BOOST_STATIC_ASSERT((boost::is_convertible<Iter::iterator_category,             std::random_access_iterator_tag>::value));    BOOST_STATIC_ASSERT((boost::is_convertible<boost::iterator_traversal<Iter>::type,             boost::random_access_traversal_tag>::value));  }  {    typedef boost::indirect_iterator<char**, int, std::random_access_iterator_tag, long&, short> Iter;    STATIC_ASSERT_SAME(Iter::value_type, int);    STATIC_ASSERT_SAME(Iter::reference, long&);      STATIC_ASSERT_SAME(Iter::pointer, int*);      STATIC_ASSERT_SAME(Iter::difference_type, short);    }  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?