Функция Variadic и копирование вставки этих параметров (как мы можем в макросе)

#c #constructor #variadic-functions

#c #конструктор #переменная функция-функции

Вопрос:

Я хочу переменную функцию и копирую-вставляю эти параметры внутри кода, как в макросе. В макросе мы бы просто поместили __VA_ARGS__ туда, куда мы хотим, чтобы они были скопированы.

На самом деле, я хочу, чтобы эти параметры были значениями для переменных, которые затем будут помещены в объявление объекта (вызывающий конструктор с использованием этих значений).

Посмотрите:

 struct Object {
    std::string name;
    int id;

    Object(std::string name, int id) {
        this->name = name;
        this->id = id;
    }

};

void create(...) {
    Object object(VA_ARGS);
}

int main() {
    create("Object1", 1);
}
 

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

Любой способ сделать это?

Комментарии:

1. Вы используете переменные аргументы в стиле c, которые представляют собой конструкцию времени выполнения, которая очень небезопасна в использовании и очень ограничена. Вы действительно должны предпочесть использовать для этого переменные шаблоны вместо переменных функций в стиле C. Не могли бы вы также объяснить, для чего вам это нужно? Ваш код показывает только один вызов create функции; это помогло бы увидеть больше примеров вызовов, которые вы хотите выполнить..

Ответ №1:

Правильный способ сделать это в C — использовать шаблоны переменных, которые представляют собой языковую конструкцию, позволяющую вам манипулировать пакетами параметров. Например.

 template <typename... Ts>
Object createObject(Tsamp;amp;... xs)
{
    return Object{std::forward<Ts>(xs)...};
}

createObject(1, 'a'); // as if `Object{1, 'a'}`