#include <iostream>
#include <vector>
template<typename Func>
void ForEachPossibility_Helper( Func&& f, std::vector<const char*>& stack) {
f(stack);
}
template<typename Func, typename Container, typename... Containers>
void ForEachPossibility_Helper( Func&& f, std::vector<const char*>& stack, Container&& arr0, Containers&&... arrays) {
for( auto const& str:arr0 ) {
stack.push_back(str);
ForEachPossibility_Helper( std::forward<Func>(f), stack, std::forward<Containers>(arrays)... );
stack.pop_back();
}
}
template<typename Func, typename... Containers>
void ForEachPossibility( Func&& f, Containers&&... arrays) {
std::vector<const char*> stack;
ForEachPossibility_Helper( std::forward<Func>(f), stack, std::forward<Containers>(arrays)... );
}
const char* arr1[] = {"AA", "BB"};
const char* arr2[] = {"CC"};
const char* arr3[] = {"DD", "EE", "FF"};
const char* arr4[] = {"GG"};
int main() {
ForEachPossibility( []( std::vector<const char*> const& list ){
for( auto&& str:list ) {
std::cout << str;
}
std::cout << "\n";
}, arr1, arr2, arr3, arr4 );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8dHlwZW5hbWUgRnVuYz4Kdm9pZCBGb3JFYWNoUG9zc2liaWxpdHlfSGVscGVyKCBGdW5jJiYgZiwgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+JiBzdGFjaykgewogIGYoc3RhY2spOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lLi4uIENvbnRhaW5lcnM+CnZvaWQgRm9yRWFjaFBvc3NpYmlsaXR5X0hlbHBlciggRnVuYyYmIGYsIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiYgc3RhY2ssIENvbnRhaW5lciYmIGFycjAsIENvbnRhaW5lcnMmJi4uLiBhcnJheXMpIHsKICBmb3IoIGF1dG8gY29uc3QmIHN0cjphcnIwICkgewogICAgc3RhY2sucHVzaF9iYWNrKHN0cik7CiAgICBGb3JFYWNoUG9zc2liaWxpdHlfSGVscGVyKCBzdGQ6OmZvcndhcmQ8RnVuYz4oZiksIHN0YWNrLCBzdGQ6OmZvcndhcmQ8Q29udGFpbmVycz4oYXJyYXlzKS4uLiApOwogICAgc3RhY2sucG9wX2JhY2soKTsKICB9Cn0KdGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gQ29udGFpbmVycz4Kdm9pZCBGb3JFYWNoUG9zc2liaWxpdHkoIEZ1bmMmJiBmLCBDb250YWluZXJzJiYuLi4gYXJyYXlzKSB7CiAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gc3RhY2s7CiAgICBGb3JFYWNoUG9zc2liaWxpdHlfSGVscGVyKCBzdGQ6OmZvcndhcmQ8RnVuYz4oZiksIHN0YWNrLCBzdGQ6OmZvcndhcmQ8Q29udGFpbmVycz4oYXJyYXlzKS4uLiApOwp9Cgpjb25zdCBjaGFyKiBhcnIxW10gPSB7IkFBIiwgIkJCIn07CmNvbnN0IGNoYXIqIGFycjJbXSA9IHsiQ0MifTsKY29uc3QgY2hhciogYXJyM1tdID0geyJERCIsICJFRSIsICJGRiJ9Owpjb25zdCBjaGFyKiBhcnI0W10gPSB7IkdHIn07CgppbnQgbWFpbigpIHsKICBGb3JFYWNoUG9zc2liaWxpdHkoIFtdKCBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gY29uc3QmIGxpc3QgKXsKICAgIGZvciggYXV0byYmIHN0cjpsaXN0ICkgewogICAgICBzdGQ6OmNvdXQgPDwgc3RyOwogICAgfQogICAgc3RkOjpjb3V0IDw8ICJcbiI7CiAgfSwgYXJyMSwgYXJyMiwgYXJyMywgYXJyNCApOwp9