В качестве начальной точки со списком индексов, созданных вручную:
template <size_t N> int make();
template<> int make<1>() { std::cout<< "First" << std::endl; return 100; }
template<> int make<2>() { std::cout << "Second" << std::endl; return 200; }
template<> int make<3>() { std::cout << "Third" << std::endl; return 100; }
struct ExecuteInOrder { ExecuteInOrder( ... ) {} };
template < typename T>
void CallTest(T t )
{
std::cout << "Your test code goes here...: " << t << std::endl;
}
template< size_t ... N >
void Do()
{
ExecuteInOrder {(CallTest(make<N>()),1)...};
}
int main()
{
Do<1,2,3>();
}
, или вы можете просто сделать его рекурсивным и использовать индекс сначала и последний, как показано ниже:
template < size_t FIRST, size_t LAST >
void ExecuteAndTest()
{
auto foo = make<FIRST>();
std::cout << "Here we go with the test" << foo << std::endl;
// go for next step
if constexpr ( LAST != FIRST ) { ExecuteAndTest<FIRST+1, LAST>(); }
}
int main()
{
// first and last index of integer sequence
ExecuteAndTest<1,3>();
}
и, наконец, всегдаот 1 до N
template < size_t FIRST, size_t LAST >
void ExecuteAndTest_Impl()
{
auto foo = make<FIRST>();
std::cout << "Here we go with the test" << foo << std::endl;
// go for next step
if constexpr ( LAST!= FIRST) { ExecuteAndTest_Impl<FIRST+1, LAST>(); }
}
template < size_t LAST >
void ExecuteAndTest()
{
ExecuteAndTest_Impl<1,LAST>();
}
int main()
{
// or always start with 1 to n inclusive
ExecuteAndTest<3>();
}