Вопрос

Вот в чем вопрос.

Это было полезно?

Решение

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

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

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

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

Управляемый код на C ++ смотрите в комментариях Рида.

Другие советы

ДА.В стандартном C ++ вы можете использовать va_arg и ...синтаксис.Видишь MSDN для получения подробной информации.

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

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

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

Видишь это запись в блоге для получения подробной информации.

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

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

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

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
}

Существует именованные параметры библиотека в boost (если я правильно понял, что такое параметры в C #).Это позволяет писать подобные функции следующим образом:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top