C++を勉強しすぎると
このような拗ねたコードしか書かなくなるぞ。
//VBスタイルForの静的バージョン。正直これ需要あるのwww
//パフォーマンスについて、全部inline関数使ってるから、コンパイラーが最適化かけたらフラットに展開される筈。
//使い方:VB_For< 開始, 終了, ステップ, [VB_For<...>] >( 関数ポインタ/関数オブジェクト/ラムダ式 );
//例: VB_For< 1, 10, 1 >( 一つの引数を持つ 関数ポインタ/関数オブジェクト/ラムダ式 );
// VB_For< 1, 10, 1,>( 二つの引数を持つ 関数ポインタ/関数オブジェクト/ラムダ式 );
// ...
// depth = 3まで実装した。かなり煩雑なコードになったが、variadic templateがあればもっとスマートな実装ができる(かもしれない)。
//
//もっと詳しい例:
//
//using namespace std;
//using namespace boost::lambda;
//int a[2][3];
//VB_For<0,1,1,
// VB_For<2,0,-1> >
//(
// var(a)[_1][_2]=_1*3+_2 //[&](int x1, int x2){ a[x1][x2]=x1*3+x2; }
//);
//cout << a[0][0] << "," << a[0][1] << "," << a[0][2] << endl;
//cout << a[1][0] << "," << a[1][1] << "," << a[1][2] << endl;
//
//上記の例をc++のforで直せばこんな感じ:
//for( int i=0; i<=1; ++i )
// for( int j=2; j>=0; --j )
// a[i][j]=i*3+j;
//namespace Private {
struct VB_For_null;
template< bool IsOK >
struct VB_For_guard;template<>
struct VB_For_guard< true > {};////
template< int COUNT__, int STEP__, int CUR__ >
struct VB_For_impl_n_1
{
template<class T>
inline static void run( const T& t )
{
t( CUR__ );
VB_For_impl_n_1::template run(t);
}
};template< int STEP__, int CUR__ >
struct VB_For_impl_n_1< 0, STEP__, CUR__ >
{
template<class T>
inline static void run( const T& t ) {}
};////
template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__ >
struct VB_For_impl_n_2_1
{
template<class T>
inline static void run( const T& t )
{
t( CUR__, CUR2__ );
VB_For_impl_n_2_1< COUNT__, STEP__, CUR__, COUNT2__-1, STEP2__, CUR2__+STEP2__ >::template run(t);
}
};template< int COUNT__, int STEP__, int CUR__, int STEP2__, int CUR2__ >
struct VB_For_impl_n_2_1< COUNT__, STEP__, CUR__, 0, STEP2__, CUR2__ >
{
template<class T>
inline static void run( const T& t ) {}
};template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__ >
struct VB_For_impl_n_2
{
template<class T>
inline static void run( const T& t )
{
VB_For_impl_n_2_1< COUNT__, STEP__, CUR__, COUNT2__, STEP2__, CUR2__ >::template run(t);
VB_For_impl_n_2< COUNT__-1, STEP__, CUR__+STEP__, COUNT2__, STEP2__, CUR2__ >::template run(t);
}
};template< int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__ >
struct VB_For_impl_n_2< 0, STEP__, CUR__, COUNT2__, STEP2__, CUR2__ >
{
template<class T>
inline static void run( const T& t ) {}
};////
template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__, int COUNT3__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3_2_1
{
template<class T>
inline static void run( const T& t )
{
t( CUR__, CUR2__, CUR3__ );
VB_For_impl_n_3_2_1< COUNT__, STEP__, CUR__, COUNT2__, STEP2__, CUR2__, COUNT3__-1, STEP3__, CUR3__+STEP3__ >::template run(t);
}
};template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3_2_1< COUNT__, STEP__, CUR__, COUNT2__, STEP2__, CUR2__, 0, STEP3__, CUR3__ >
{
template<class T>
inline static void run( const T& t ) {}
};template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__, int COUNT3__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3_2
{
template<class T>
inline static void run( const T& t )
{
VB_For_impl_n_3_2_1< COUNT__, STEP__, CUR__, COUNT2__, STEP2__, CUR2__, COUNT3__, STEP3__, CUR3__ >::template run(t);
VB_For_impl_n_3_2< COUNT__, STEP__, CUR__, COUNT2__-1, STEP2__, CUR2__+STEP2__, COUNT3__, STEP3__, CUR3__ >::template run(t);
}
};template< int COUNT__, int STEP__, int CUR__, int STEP2__, int CUR2__, int COUNT3__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3_2< COUNT__, STEP__, CUR__, 0, STEP2__, CUR2__, COUNT3__, STEP3__, CUR3__ >
{
template<class T>
inline static void run( const T& t ) {}
};template< int COUNT__, int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__, int COUNT3__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3
{
template<class T>
inline static void run( const T& t )
{
VB_For_impl_n_3_2< COUNT__, STEP__, CUR__, COUNT2__, STEP2__, CUR2__, COUNT3__, STEP3__, CUR3__ >::template run(t);
VB_For_impl_n_3< COUNT__-1, STEP__, CUR__+STEP__, COUNT2__, STEP2__, CUR2__, COUNT3__, STEP3__, CUR3__ >::template run(t);
}
};template< int STEP__, int CUR__, int COUNT2__, int STEP2__, int CUR2__, int COUNT3__, int STEP3__, int CUR3__ >
struct VB_For_impl_n_3< 0, STEP__, CUR__, COUNT2__, STEP2__, CUR2__, COUNT3__, STEP3__, CUR3__ >
{
template<class T>
inline static void run( const T& t ) {}
};template< int DEPTH, class T >
struct VB_For_impl_n;template<class FORT>
struct VB_For_impl_n< 2, FORT >
{
template<class T>
inline static void run( const T& t )
{
VB_For_impl_n_2< FORT::count, FORT::step, FORT::cur, FORT::next_t::count, FORT::next_t::step, FORT::next_t::cur >::template run(t);
}
};template<class FORT>
struct VB_For_impl_n< 3, FORT >
{
template<class T>
inline static void run( const T& t )
{
VB_For_impl_n_3<
FORT::count, FORT::step, FORT::cur,
FORT::next_t::count, FORT::next_t::step, FORT::next_t::cur,
FORT::next_t::next_t::count, FORT::next_t::next_t::step, FORT::next_t::next_t::cur
>::template run(t);
}
};}
template< int FROM__, int TO__, int STEP__, class NEXT__ = Private::VB_For_null >
struct VB_For : Private::VB_For_guard< FROM__ == TO__ || ( (FROM__ < TO__) ? (STEP__ > 0) : (STEP__ < 0) ) >
{
typedef NEXT__ next_t;enum {
count = FROM__ == TO__ ? 1 : ( TO__ + STEP__ - FROM__ ) / STEP__ ,
cur = FROM__,
step = STEP__,
depth = NEXT__::depth + 1
};template
inline VB_For( const T& t ) { Private::VB_For_impl_n< depth, VB_For>::template run(t); }
};template< int FROM__, int TO__, int STEP__ >
struct VB_For< FROM__, TO__, STEP__, Private::VB_For_null >
: Private::VB_For_guard< FROM__ == TO__ || ( (FROM__ < TO__) ? (STEP__ > 0) : (STEP__ < 0) ) >
{
typedef Private::VB_For_null next_t;enum {
count = FROM__ == TO__ ? 1 : ( TO__ + STEP__ - FROM__ ) / STEP__ ,
cur = FROM__,
step = STEP__,
depth = 1
};template<class T>
inline VB_For( const T& t ) { Private::VB_For_impl_n_1::template run(t); }
};
初回記念
スラマッパギ