<gintenlib/list_format.hpp>
- list_format ¡§ ¥³¥ó¥Æ¥Ê¤Î¤ª¼ê·Ú¥¹¥È¥ê¡¼¥à½ÐÎÏ
+ list_format : コンテナのお手軽ストリーム出力
- Àë¸À¡§
+ 宣言:
template< typename Range >
unspecified list_format( const Range& src );
template< typename InIte, typename Pre, typename Delim, typename Post >
unspecified list_format( const InIte& begin, const InIte& end, const Pre& pre, const Delim& delim, const Post& post );
- µ¡Ç½¡§
- Ǥ°Õ¤Î¥³¥ó¥Æ¥Ê¤äÇÛÎó¡Ê boost »ÈÍÑÈǤǤÏǤ°Õ¤Î range ¡Ë¤ò¡¢¥¹¥È¥ê¡¼¥à¤Ëή¤»¤ë¤è¤¦²Ã¹©¤·¤Þ¤¹¡£
- ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï ( 1, 2, 3, 4 ) ¤Î¤è¤¦¤Ë½ÐÎϤµ¤ì¤Þ¤¹¤¬¡¢°ú¿ô¤ò»ØÄꤹ¤ë¤³¤È¤Ç¥¹¥¿¥¤¥ë¤ÏÊѹ¹¤Ç¤¤Þ¤¹¡£
+ 機能:
+ 任意のコンテナや配列( boost 使用版では任意の range )を、ストリームに流せるよう加工します。
+ デフォルトでは ( 1, 2, 3, 4 ) のように出力されますが、引数を指定することでスタイルは変更できます。
- »ÈÍÑÎ㡧
- // v ¤ÏǤ°Õ¤Î¥³¥ó¥Æ¥Ê¡£( 1, 2, 3 ) ¤Î¤è¤¦¤Ëɽ¼¨¤µ¤ì¤Þ¤¹
+ 使用例:
+ // v は任意のコンテナ。( 1, 2, 3 ) のように表示されます
cout << gintenlib::list_format(v) << endl;
- // °ú¿ô¤ò»ØÄꤹ¤ì¤Ð¡¢[ 1 | 2 | 3 ] ¤Î¤è¤¦¤Êɽ¼¨¤Ë¤â¤Ç¤¤Þ¤¹
+ // 引数を指定すれば、[ 1 | 2 | 3 ] のような表示にもできます
cout << gintenlib::list_format( v, "[ ", " | ", " ]" ) << endl;
- // ¤Þ¤¿¡¢¥¤¥Æ¥ì¡¼¥¿¤ò»È¤Ã¤Æ½ÐÎÏÂоݤò»ØÄꤹ¤ë¤³¤È¤â½ÐÍè¤Þ¤¹¡£
- // ¤³¤Î¾ì¹ç¤ÏµÕ½ç¤Îɽ¼¨¤Ë¤Ê¤ê¤Þ¤¹
+ // また、イテレータを使って出力対象を指定することも出来ます。
+ // この場合は逆順の表示になります
cout << gintenlib::list_format( v.rbegin(), v.rend() ) << endl;
- Ê䡧
- ¡¦´ðËÜŪ¤Ë list_format ´Ø¿ô¤Ï¡¢¡ÖÌá¤êÃͤò¥¹¥È¥ê¡¼¥à¤Ëή¤¹¡×¤È¤¤¤¦»È¤¤Êý¤Î¤ß¤òÁÛÄꤷ¤Æ¤¤¤Þ¤¹¡£
- ¡¦¤¿¤À¤·¡¢list_format ´Ø¿ô¤ÎÌá¤êÃÍ¤Ë boost::lexical_cast ¤òŬ±þ¤¹¤ë¤³¤È¤Ï²Äǽ¤Ç¤¹¡£
- ¡¦¤Þ¤¿¡¢Ìá¤êÃͤò gintenlib::output_element ¥ª¥Ö¥¸¥§¥¯¥È¤Ë³ÊǼ¤¹¤ë¤³¤È¤â½ÐÍè¤Þ¤¹¡£
- ¡¦¾åµ°Ê³°¤ÎÌÜŪ¤Ç»È¤Ã¤¿¾ì¹ç¡¢list_format ´Ø¿ô¤ÎÆ°ºî¤ÏÉÔÄê¤È¤Ê¤ê¤Þ¤¹¡£
+ 補足:
+ ・基本的に list_format 関数は、「戻り値をストリームに流す」という使い方のみを想定しています。
+ ・ただし、list_format 関数の戻り値に boost::lexical_cast を適応することは可能です。
+ ・また、戻り値を gintenlib::output_element オブジェクトに格納することも出来ます。
+ ・上記以外の目的で使った場合、list_format 関数の動作は不定となります。
*/
namespace gintenlib
{
- // ¼ÂºÝ¤Ë¥¹¥È¥ê¡¼¥à¤Ëή¤¹¥¯¥é¥¹
+ // å®\9fé\9a\9bã\81«ã\82¹ã\83\88ã\83ªã\83¼ã\83 ã\81«æµ\81ã\81\99ã\82¯ã\83©ã\82¹
template< typename InIte, typename Pre = const char*,
typename Delim = const char*, typename Post = const char* >
struct list_format_impl_
typename boost::call_traits<Delim>::value_type delim_;
typename boost::call_traits<Post>::value_type post_;
- // ½ÐÎϤμÂÁõ
- // ¥Æ¥ó¥×¥ì¡¼¥È¤Ë¤è¤ê std::ostream ¤Ë¸Â¤é¤º½ÐÎϤǤ¤Þ¤¹
+ // 出力の実装
+ // テンプレートにより std::ostream に限らず出力できます
template<typename Stream>
friend Stream& operator<< ( Stream& os, const list_format_impl_& src )
{
- // ¶õ¤Î¥ê¥¹¥È¤òɽ¼¨¤µ¤»¤è¤¦¤È¤·¤¿¾ì¹ç¡¢²¿¤âɽ¼¨¤µ¤ì¤Ê¤¤
+ // 空のリストを表示させようとした場合、何も表示されない
if( src.begin_ == src.end_ ){ return os; }
- // ɽ¼¨ËÜÂÎ
+ // 表示本体
os << src.pre_;
InIte ite = src.begin_;
}; // struct list_format_impl_
- // ´Ø¿ôËÜÂÎ
+ // 関数本体
- // ¥³¥ó¥Æ¥ÊÈÇ
+ // コンテナ版
- // °ìÈÌ·Á¡£Ç¤°Õ¤Î pre, delim, post ¤Ë´Ø¤·¤Æ
- // os << pre << Í×ÁÇ£± << delim << Í×ÁÇ£² << ... << delim << Í×ÁÇ£î << end;
- // ¤È¤¤¤¦¥¤¥á¡¼¥¸¤Ç½ÐÎϤµ¤ì¤ë¡£
+ // 一般形。任意の pre, delim, post に関して
+ // os << pre << 要素1 << delim << 要素2 << ... << delim << 要素n << end;
+ // というイメージで出力される。
template< typename Range, typename Pre, typename Delim, typename Post >
inline const list_format_impl_< typename boost::range_iterator<const Range>::type, Pre, Delim, Post >
list_format
( begin(src), end(src), pre, delim, post );
}
- // ¾ÊάÈÇ¡£( Í×ÁÇ£±, Í×ÁÇ£², ... , Í×ÁÇ£î ) ¤È¤¤¤¦´¶¤¸¤Ë½ÐÎÏ
+ // 省略版。( 要素1, 要素2, ... , 要素n ) という感じに出力
template< typename Range >
inline const list_format_impl_< typename boost::range_iterator<const Range>::type >
list_format( const Range& src )
}
- // ¥¤¥Æ¥ì¡¼¥¿ÈÇ
+ // イテレータ版
- // °ìÈÌ·Á
+ // 一般形
template< typename InIte, typename Pre, typename Delim, typename Post >
inline const list_format_impl_<InIte, Pre, Delim, Post>
list_format
return list_format_impl_<InIte, Pre, Delim, Post>( begin, end, pre, delim, post );
}
- // ¾ÊάÈÇ
+ // 省略版
template< typename InIte >
inline const list_format_impl_<InIte>
list_format( const InIte& begin, const InIte& end )