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:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.