возможности языка — C ++: добавление и переопределение аргументов по умолчанию в реальном мире

Существует возможность добавить или переопределить аргументы функции по умолчанию в C ++. Давайте посмотрим на пример:

void foo(int a, int b, int c = -1) {
std::cout << "foo(" << a << ", " << b << ", " << c << ")\n";
}

int main() {
foo(1, 2);   // output: foo(1, 2, -1)

// void foo(int a, int b = 0, int c);
// error: does not use default from surrounding scope

void foo(int a, int b, int c = 30);
foo(1, 2);   // output: foo(1, 2, 30)

// void foo(int a, int b, int c = 35);
// error: we cannot redefine the argument in the same scope

// has a default argument for c from a previous declaration
void foo(int a, int b = 20, int c);
foo(1);      // output: foo(1, 20, 30)

void foo(int a = 10, int b, int c);
foo();       // output: foo(10, 20, 30)

{
// in inner scopes we can completely redefine them
void foo(int a, int b = 4, int c = 8);
foo(2);  // output: foo(2, 4, 8)
}

return 0;
}

Онлайн версия для игры с: http://ideone.com/vdfs3t

Эти возможности регулируются стандартом в 8.3.6. Более конкретные детали в 8.3.6 / 4

Для не шаблонных функций аргументы по умолчанию могут быть добавлены позже
объявления функции в той же области видимости. Объявления в
разные области имеют совершенно разные наборы аргументов по умолчанию.
То есть объявления во внутренних областях не получают аргументы по умолчанию
из деклараций во внешних областях и наоборот. В данной функции
декларация, каждый параметр после параметра со значением по умолчанию
Аргумент должен иметь аргумент по умолчанию, предоставленный в этом или предыдущем
объявление или должен быть пакетом параметров функции. Аргумент по умолчанию
не должно быть переопределено более поздним объявлением (даже к тому же
значение)

Честно говоря, я никогда не использую эту функцию при кодировании на c ++. Я использовал подобные фрагменты кода несколько раз, чтобы удивить своих коллег, но, конечно, не в рабочем коде. Таким образом, возникает вопрос: знаете ли вы реальные примеры кода, которые используют эти функции с преимуществами?

15

Решение

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]