С++: добавление и переопределение аргументов по умолчанию в реальном мире
Существует возможность добавить или переопределить аргументы по умолчанию для функции в С++. Рассмотрим пример:
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
Для функций без шаблона аргументы по умолчанию могут быть добавлены позже объявления функции в той же области. Объявления в у разных областей есть совершенно разные наборы аргументов по умолчанию. То есть объявления во внутренних областях не принимают аргументы по умолчанию из деклараций во внешних областях и наоборот. В данной функции объявление, каждый параметр, следующий за параметром со значением по умолчанию аргумент должен иметь аргумент по умолчанию, указанный в этом или предыдущем объявление или должен быть пакетом параметров функции. Аргумент по умолчанию не должны быть переопределены более поздним выражением (даже не к тому же стоимость)...
Честно говоря, я никогда не использую эту функцию при кодировании в С++. Несколько раз я использовал подобные фрагменты кода, чтобы удивить своих коллег, но, конечно, не в производственном коде. Таким образом, возникает вопрос: знаете ли вы примеры реального мира кода, которые используют эти функции с выгодами?
Ответы
Ответ 1
Если вы не можете изменить какой-либо существующий код или библиотеку, и вам действительно нечего беспокоиться, чтобы ввести правильный аргумент, тогда изменение аргумента по умолчанию для некоторой области может быть решением.
Похоже, что этот хак может быть полезен при работе с кодом С++, созданным каким-то унаследованным инструментом. Например, если сгенерированный код всегда имел сотни вызовов в какую-либо внешнюю библиотеку, используя аргумент по умолчанию, но теперь аргумент по умолчанию больше не правильный.