私はいくつかのラムダ関数を実行する必要がありますが、すべての各N
ラムダprologue()
関数も実行する必要があります。ラムダの数は任意に大きくすることができ、コンパイル時にはN
が知られています。このような何か:任意の数のブロックでラムダ関数のスケーリング可能なグループ化
static void prologue(void)
{
cout << "Prologue" << endl;
}
int main()
{
run<3>(// N = 3
[](){ cout << "Simple lambda func 1" << endl; },
[](){ cout << "Simple lambda func 2" << endl; },
[](){ cout << "Simple lambda func 3" << endl; },
[](){ cout << "Simple lambda func 4" << endl; },
[](){ cout << "Simple lambda func 5" << endl; },
[](){ cout << "Simple lambda func 6" << endl; },
[](){ cout << "Simple lambda func 7" << endl; }
);
}
出力:
Prologue
Simple lambda func 1
Simple lambda func 2
Simple lambda func 3
Prologue
Simple lambda func 4
Simple lambda func 5
Simple lambda func 6
Prologue
Simple lambda func 7
End
剰余を適切に処理しなければなりません。
私は以下の解決策に達しましたが、わかりましたが、私はのそれぞれN
のハンドラを書かなければならないので、非常にスケーラブルではありません!
N
の可能性をすべて網羅するために、いくつかのマジックメタプログラミングが可能ですか?私は焦点を失ったし、この問題を解決するために全く異なるアプローチがありますか?コンパイル時にすべてを解決する必要があります。
#include <iostream>
using namespace std;
static void prologue(void);
// Primary template
template< int N, typename... Args>
struct Impl;
// Specialitzation for last cases
template< int N, typename... Args >
struct Impl
{
static void wrapper(Args... funcs)
{
Impl<N-1, Args...>::wrapper(funcs...);
}
};
// Specilitzation for final case
template<int N>
struct Impl<N>
{
static void wrapper()
{
cout << "End" << endl;
}
};
template< typename Arg1, typename... Args >
struct Impl<1, Arg1, Args...>
{
static void wrapper(Arg1 func1, Args... funcs)
{
prologue();
func1();
Impl<1, Args...>::wrapper(funcs...);
}
};
template< typename Arg1, typename Arg2, typename... Args >
struct Impl<2, Arg1, Arg2, Args...>
{
static void wrapper(Arg1 func1, Arg2 func2, Args... funcs)
{
prologue();
func1();
func2();
Impl<2, Args...>::wrapper(funcs...);
}
};
template< typename Arg1, typename Arg2, typename Arg3, typename... Args >
struct Impl<3, Arg1, Arg2, Arg3, Args...>
{
static void wrapper(Arg1 func1, Arg2 func2, Arg3 func3, Args... funcs)
{
prologue();
func1();
func2();
func3();
Impl<3, Args...>::wrapper(funcs...);
}
};
// Static class implementation wrapper
template< int N, typename... Args >
static void run(Args... funcs)
{
Impl<N, Args...>::wrapper(funcs...);
}
EDIT:関連questionを掲載。
これは美しいです。 –
@yurikilochek - カンマ演算子のパワーを過小評価しないでください:-) – max66
あなたは '' fn'のretirn型を知らないので、 '' operator ''をオーバーロードする可能性があります。 – Yakk