#include <iostream>#include <concepts>#include <iterator>#include <memory>#include <vector>template<std::input_iteratorI>voidf(constchar*name){std::cout<<name<<" is input_iterator"<<std::endl;}template<typenameI>voidf(constchar*name){std::cout<<name<<" is not input_iterator"<<std::endl;}structsample_input_iterator{// *thisの参照を返さなければならない(戻り値型は自身の参照型)friendautooperator++(sample_input_iterator&)->sample_input_iterator&;// 戻り値型はvoidでも可friendautooperator++(sample_input_iterator&,int)->sample_input_iterator;// const修飾されていなければならない// indirectly_readableコンセプトにおいて、iter_reference_tの結果がconst有無両方で一致することが求められるfriendautooperator*(constsample_input_iterator&)->int&;// 少なくともこの3つは必須usingdifference_type=int;usingvalue_type=int;usingiterator_concept=std::input_iterator_tag;};intmain(){f<int*>("int*");f<constint*>("const int*");f<std::vector<int>::iterator>("std::vector<int>::iterator");f<std::istream_iterator<double>>("std::istream_iterator<double>");f<sample_input_iterator>("sample_input_iterator");std::cout<<"\n";f<int*const>("int* const");f<std::ostream_iterator<double>>("std::ostream_iterator<double>");}
出力
int* is input_iterator
const int* is input_iterator
std::vector<int>::iterator is input_iterator
std::istream_iterator<double> is input_iterator
sample_input_iterator is input_iterator
int* const is not input_iterator
std::ostream_iterator<double> is not input_iterator
You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.