Как получить доступ к аргументам внутри структуры?

Мне нужно получить аргументы внутри конструктора. Можно ли записать их в массив и потом с ними работать?

struct prototype {
    template <class... T1>
    prototype(T1 ...args) {
        std::cout << "test" << std::endl;
        // Это так не работает
        std::cout << "args[0]" << std::endl;
        std::cout << "args[1]" << std::endl;
        // Где они хранятся, не могу понять?
    }
};

int option_1 = 10;
std::string option_2 = "test2";
std::vector<int> option_3(10);
auto option_4 = 0.41;


int main() {

    prototype(option_1, option_2, option_3, option_4);
    prototype(option_1, option_2);
    
    system("pause");
    
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Ну, например, так устроит?...

#include <vector>
#include <string>
#include <iostream>
#include <any>

using namespace std;

struct prototype
{
    vector<any> p;
    template <class... T1>
    prototype(T1 ...args)
    {
        (p.push_back(args), ...);
        std::cout << "test" << std::endl;
    }


};

int option_1 = 10;
std::string option_2 = "test2";
std::vector<int> option_3(10);
auto option_4 = 0.41;


int main() {

    prototype p1(option_1, option_2, option_3, option_4);
    prototype p2(option_1, option_2);

    cout << any_cast<double>(p1.p[3]) << endl;
    cout << any_cast<string>(p2.p[1]) << endl;
}

Или как вариант:

struct prototype
{
    template <class... T1>
    prototype(T1 ...args)
    {
        auto p = forward_as_tuple(args...);
        cout << get<0>(p) << endl;
        if constexpr(tuple_size_v<decltype(p)> >= 3 )
        {
            cout << get<3>(p) << endl;
        }
    }


};

int option_1 = 10;
std::string option_2 = "test2";
std::vector<int> option_3(10);
auto option_4 = 0.41;


int main() {

    prototype p1(option_1, option_2, option_3, option_4);
    prototype p2(option_1, option_2);

}

Да, к вашему

Где они хранятся, не могу понять?

Пока не сохраните сами — нигде, потому что все эти разборки выполняются во время компиляции, а не во время выполнения.

→ Ссылка