我必须执行几个lambda函数,但每次每个N
lambda表达式一个prologue()
函数也必须运行。 lambda表达式的数量可以是任意大和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... );
}
编辑 :发布一个相关的问题 。