2008-08-25

コンパイルエラーみてコーディング余裕でした

C++0x いきなりつまづくコンセプト - Faith and Brave - C++で遊ぼう

貧弱ゥ貧弱ゥ!
お前は今までに出したコンパイルエラーの数を覚えているのかッ!

template < typename T >
    requires std::Range< T >
       && std::RandomAccessIterator< T::iterator >
       && std::ShuffleIterator< T::iterator >
       && std::OutputIterator< T::iterator, T::iterator::reference >
       && std::OutputIterator< T::iterator, T::iterator::value_type const & >
       && std::CopyConstructible< T::iterator::value_type >
       && std::LessThanComparable< T::iterator::value_type >

void sort( T & r )
{
    std::sort( begin(r), end(r) ) ;
}

int main()
{
    std::vector<int> v ;
    v.push_back(3) ;
    v.push_back(1) ;
    v.push_back(4) ;

    sort(v) ;

    for (int item : v)
    {
        std::cout << item << std::endl ;
    }
}

こんな方法もある。

auto concept SortableRange< typename T >
{
    requires std::Range< T >
       && std::RandomAccessIterator< T::iterator >
       && std::ShuffleIterator< T::iterator >
       && std::OutputIterator< T::iterator, T::iterator::reference >
       && std::OutputIterator< T::iterator, T::iterator::value_type const & >
       && std::CopyConstructible< T::iterator::value_type >
       && std::LessThanComparable< T::iterator::value_type > ;
}

template < SortableRange T >
void sort( T & r )
{
    std::sort( begin(r), end(r) ) ;
}

ちなみに、こうなる理由を説明すると、まず、自分自身はRangeを使っている。std::sortは、次のようになっている。

 template<RandomAccessIterator _Iter>
  requires OutputIterator<_Iter, _Iter::reference>
     && OutputIterator<_Iter, const _Iter::value_type&>
     && LessThanComparable<_Iter::value_type>
     && ShuffleIterator<_Iter>
     && CopyConstructible<_Iter::value_type>
  inline void
  sort(_Iter __first, _Iter __last) ;

これも全部必要である。

『コードは動作する』『コンパイルも通る』。両方やらなくっちゃあならないってのが、C++0xプログラマの辛いところだな。覚悟はいいか? オレはできてる。

No comments: