Подтвердить что ты не робот

Что-нибудь вроде С# params в С++?

Это вопрос.

4b9b3361

Ответ 1

Для неуправляемого С++ с тем же удобным синтаксисом no.

Но есть поддержка списков переменных аргументов для функций на С++.

В основном вы объявляете функцию с последним параметром, являющимся эллипсисом (...), и внутри тела функции используют вызовы va_start()/va_arg() для анализа списка предоставленных параметров.

Этот механизм не безопасен по типу, и вызывающий может передать что угодно, поэтому вы должны четко документировать открытый интерфейс функции и то, что вы ожидаете получить.

Для управляемого кода на С++ см. комментарии Рида.

Ответ 2

Да. В стандарте C++ вы можете использовать va_arg и синтаксис.... Посмотрите MSDN для деталей.

Для C++/CLI, есть ярлык для этого.

Вы делаете это как:

void TheMethod( String^ firstArgument, ... array<Object^>^ variableArgs );

Смотрите этот блог для деталей.

Ответ 3

В настоящее время, с современным С++, вы можете использовать современные методы безопасного типа для вариативных функций.

Используйте либо variadic templates, либо std:: initializer_list, если все ваши аргументы имеют один и тот же тип

С вариационным шаблоном вы используете рекурсию для прохождения списка переменных параметров. Пример шаблона Variadic:

template<class T>
void MyFoo(T arg)
{
    DoSomething(arg);
}
template<class T, class... R>
void MyFoo(T arg, R... rest)
{
    DoSomething(arg);
    // If "rest" only has one argument, it will call the above function
    // Otherwise, it will call this function again, with the first argument
    // from "rest" becoming "arg"
    MyFoo(rest...); 
}

int main()
{
    MyFoo(2, 5.f, 'a');
}

Это гарантирует, что если DoSomething или любой другой код, который вы запускаете до рекурсивного вызова MyFoo, имеет перегрузку для типа каждого аргумента, который вы передаете функции MyFoo, то будет вызвана точная перегрузка.

В std:: initializer_list вы используете простой цикл foreach для прохождения аргументов

template<class T>
void MyFoo(std::initializer_list<T> args)
{
    for(auto&& arg : args)
    {
        DoSomething(arg);
    }
}
int main()
{
    MyFoo({2, 4, 5, 8, 1, 0}); // All the arguments have to have the same type
}

Ответ 4

Существует named parameters библиотека в boost (если я правильно понял, какие параметры в С#). Он позволяет записывать такие функции:

int y = lib::f(_name = "bob", _index = 2);

Не может ничего сказать о том, есть ли существенные накладные расходы.