Как в C++ передать одни параметры, оставив другие значения по умолчанию?

Я уверен, что здесь уже был дан ответ, но поиск продолжает возвращать PHP, C# и Java. Я специально спрашиваю о C++.

Если у меня есть функция, которая принимает пять аргументов, и все они имеют значения по умолчанию, но я хочу вызвать ее, явно задав значение для третьего аргумента, что мне передать для первого и второго аргументов? (Я знаю, что func(,,"Third") не работает, и func(thirdArg:"Third") тоже)


person Mark A. Donohoe    schedule 15.08.2014    source источник
comment
Язык не поддерживает это, так что вам нужно прыгнуть через несколько обручей - см. Увеличить библиотеку параметров и Идиома именованного параметра.   -  person jrok    schedule 15.08.2014
comment
именованный параметр не поддерживается в С++. Вы должны обернуть его, используя перегрузку метода. :(   -  person Jun Guo    schedule 15.08.2014
comment
Что касается поиска, то ограничение его до C++ с [c++] должно помочь.   -  person T.C.    schedule 15.08.2014
comment


Ответы (4)


В C++ вы должны указать все параметры вплоть до значений по умолчанию, поэтому это должно быть func("First","Second","Third").

C++ также требует, чтобы у вас были значения по умолчанию в «конце» списка параметров, поэтому вы не можете сделать что-то вроде func(defaulted, not-defaulted)

Оба эти правила связаны с правилами разрешения перегрузок C++.

person Chuck Walbourn    schedule 15.08.2014
comment
Вы на 100% уверены в этом? Я думал, что есть ключевое слово или что-то, что вы можете указать, что означает «Использовать значение по умолчанию»… что-то вроде func(DEFAULT, DEFAULT, Third) или подобное. - person Mark A. Donohoe; 15.08.2014
comment
В C++11 есть новое ключевое слово default, но оно предназначено для управления некоторыми элементами C++ по умолчанию, такими как конструкторы копирования/перемещения и операторы присваивания. - person Chuck Walbourn; 15.08.2014
comment
Параметры по умолчанию обычно задаются разработчиком функции. Как в win32 с _USEDEFAULT, как CW_USEDEFAULT или как в X11 с параметром -1 для размера. Но они не встроены в C++. - person polarysekt; 15.08.2014
comment
Вот почему обычно значение по умолчанию что-то вроде 0 или nullptr, так что, если клиент укажет его, легко запомнить, какое значение "по умолчанию"... - person Chuck Walbourn; 15.08.2014
comment
@ChuckWalbourn Ключевое слово default не ново в С++ 11 (подумайте об операторах switch). Синтаксис = default такой. - person T.C.; 15.08.2014
comment
@TC - Достаточно честно. Новое использование существующего ключевого слова вместе с существующим ключевым словом delete. По крайней мере, они не перегружали значение static снова :) - person Chuck Walbourn; 15.08.2014
comment
Технически невозможно смешать необязательные и необязательные параметры в любом порядке в шаблоне функции, потому что ни один компилятор ни для какого языка не может сопоставить функцию, если параметр в середине списка является необязательным, и вы не можете знать, отсутствует он или нет, или если 2 строки подряд вставлены правильно. Вам нужно перегрузить свою функцию, если вы хотите, чтобы одновременно работало больше возможностей. - person Steini; 15.08.2014

Вы можете сделать что-то похожее на решение для параметров по умолчанию в конструкторах Java.

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

Решение достигается с помощью перегрузки функций:

void Foo(int default, int nodefault){
    ...
}

void Foo(int nodefault){
    Foo(10, nodefault); //10 - is default option
}

int main(){
    Foo(3); //calls Foo(10, 3);
}
person MrPisarik    schedule 15.08.2014

Это нетривиально. Может быть, вы можете попробовать повысить параметр. Затем вы можете передать параметр как таковой,

func(third_="third")

Пожалуйста, проверьте =>

http://www.boost.org/doc/libs/1_56_0/libs/parameter/doc/html/index.html#named-function-parameters

person nature1729    schedule 15.08.2014
comment
Вы можете обойти это с помощью идиомы именованных параметров, которую Boost реализует здесь, но это все еще не особенность языка C++. - person Chuck Walbourn; 15.08.2014
comment
@ChuckWalbourn Мой ответ был больше связан с возможностью сделать то, что требуется. - person nature1729; 15.08.2014

Прямой поддержки в языке нет. Однако идиома, часто используемая программистами C++ для замены отсутствия подобных bash позиционных параметров, — это идиома именованного параметра..

Предполагая, что ваша функция является методом-членом класса, вы можете легко применить эту идиому:

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

Пример:

class Person{

public:

    Person& setAge(int agep) { age = agep ; return *this; }

    Person& setWeight(double weightp) { weight = weightp ; return *this; }

    Person& setName(const std::string& namep) { name = namep ; return *this; }

private:
    int age = 0;
    double weight = 0.0;
    std::string name;
};

int main(){
    Person p;

    p.setAge(42).setName("Kurt"); // set age and name, but not weight
}
person quantdev    schedule 15.08.2014