#include <iostream>
#include <string>
#include <vector>
using namespace std;

template <typename T, size_t array_size>
inline void copy_array_to_vector(vector<T> &vec, T (&arr)[array_size]) {
    vec.insert(vec.end(), &(arr[0]), &(arr[array_size]));
}

template <typename T>
inline void DFS_cascade_string(vector<string> &vec_str, vector<string> &DFS_vec_str, const vector<T>& vec) {
    string str_tmp;
    for (int i = 0; i < DFS_vec_str.size(); i++)
        str_tmp += DFS_vec_str[i] + " ";

    for (int i = 0; i < vec.size(); i++)
        vec_str.push_back(str_tmp + to_string(vec[i]));
}
template <typename T, typename ... ARGS>
inline void DFS_cascade_string(vector<string> &vec_str, vector<string> &DFS_vec_str, const vector<T>& vec, const ARGS&... args) {

    for (int i = 0; i < vec.size(); i++) {
        DFS_vec_str.push_back(to_string(vec[i]));
        DFS_cascade_string(vec_str, DFS_vec_str, args...);
        DFS_vec_str.pop_back();
    }

}
template <typename ... ARGS>
inline void DFS_cascade_string(vector<string> &vec_str, const ARGS&... args) {
    vector<string> DFS_vec_str;
    DFS_cascade_string(vec_str, DFS_vec_str, args...);
}


int main() {
	// var1
    vector<int> vec_var1;
    int  local_var1[] = { 10, 20, 30, 40};
    copy_array_to_vector(vec_var1, local_var1);

    // var2
    vector<double> vec_var2;
    double local_var2[] = { 44.0, 88.0 };
    copy_array_to_vector(vec_var2, local_var2);

    // var3
    vector<double> vec_var3;
    double local_var3[] = { 0.0 };
    copy_array_to_vector(vec_var3, local_var3);

    // var4
    vector<double> vec_var4;
    double local_var4[] = { 123.0, 150.0 };
    copy_array_to_vector(vec_var4, local_var4);


	// ===============================================
	// test 1
    vector<string> vec_str;
    DFS_cascade_string(vec_str, vec_var1, vec_var2, vec_var3);
    for (int i = 0; i < vec_str.size(); i++)
        printf("[%d], %s\n", i, vec_str[i].c_str());
    
    
    printf("\n======================\n\n");
    
    // test 2
    vec_str.clear();
    DFS_cascade_string(vec_str, vec_var1, vec_var2, vec_var3, vec_var4);
    for (int i = 0; i < vec_str.size(); i++)
        printf("[%d], %s\n", i, vec_str[i].c_str());
    
    
	return 0;
}