Аргумент по умолчанию в C ++ - PullRequest
1 голос
/ 18 ноября 2011

Я новичок в C ++, у меня есть вопрос об аргументе по умолчанию.Если есть функция со следующим прототипом

void f(int=10,int=20,int=30,int=40)

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

Ответы [ 7 ]

6 голосов
/ 18 ноября 2011

Вы не можете. Аргументы функций соответствуют параметрам по порядку. Вы можете использовать перегрузку вместо аргументов по умолчанию, например:

void myFunc(int a,int b,int c,int d);
void myFunc(int a,int c) {
    myFunc(a,20,c,40);
}
3 голосов
/ 18 ноября 2011

Это не так, как аргументы по умолчанию в C ++. Если вы передадите два аргумента в функцию f, они всегда будут в качестве первых двух аргументов, в то время как последние два будут 30 и 40.

Другими словами, функции C ++ поддерживают только позиционные параметры.

3 голосов
/ 18 ноября 2011

Не должно быть возможно.Они будут рассматриваться как первые два.

Вы можете просто создать функцию с другим именем, взять два аргумента и вызвать f.

В качестве альтернативы, если вы хотите эмулировать namedаргументы, вы можете использовать что-то похожее на Свободные интерфейсы .Пример:

#include <iostream>
using namespace std;

int f_impl(int a,int b, int c, int d){
    cout << a << " " << b << " " << c << " " << d << endl;
    return 42;
}

struct f{
    int _a, _b, _c, _d;
    f() : _a(10), _b(20), _c(30), _d(40){}
    f& a(int a){ _a = a; return *this;}
    f& b(int b){ _b = b; return *this;}
    f& c(int c){ _c = c; return *this;}
    f& d(int d){ _d = d; return *this;}
    int operator()(){ return f_impl(_a, _b, _c, _d); }
};

#define F(x) (f()x())

int main(){

    f().a(100).c(300)();

    cout << F(.b(1000).d(4000)) << endl;

    return 0;
}

Вывод:

100 20 300 40
10 1000 30 4000
42
1 голос
/ 18 ноября 2011

Запрашиваемая вами функция называется 'Именованные параметры' .

Объединенные параметры по умолчанию и Именованные параметры дают вам гораздо больше возможностей делать то, что вы предложили, но, к сожалению, в C ++ нет именованных параметров.Однако некоторые другие языки, такие как C # и VB и, возможно, Python, имеют именованные параметры

1 голос
/ 18 ноября 2011

Как говорили другие люди, вы не можете сделать это в C ++.

Но вы можете создать структуру / класс с четырьмя целочисленными членами, которые инициализируются значениями, которые вы определили.И вы передадите его в качестве параметра функции.

Пример

struct Param
{
  int a;
  int b;
  int c;
  int d;

  Param() : a(10), b(20), c(30), d(40) {}
  void setA(int value) { a = value; }
  void setB(int value) { a = value; }
  void setC(int value) { a = value; }
  void setD(int value) { a = value; }
}

void f(Param& param) {}

Param param;
param.setA(67);
param.setC(9);
f(param);
0 голосов
/ 18 ноября 2011

На самом деле вы можете именовать параметры в C ++ с небольшой помощью из boost :: parameter (также упоминается в вики-статье об именованных параметрах).

0 голосов
/ 18 ноября 2011

Аргументы по умолчанию будут назначаться с последнего при необходимости.

http://en.wikipedia.org/wiki/Default_argument

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...