Можно ли использовать результат вызова функции в качестве значения параметра по умолчанию?

StackOverflow https://stackoverflow.com/questions/202718

  •  03-07-2019
  •  | 
  •  

Вопрос

Есть ли хороший метод для написания заголовков функций C / C ++ с параметрами по умолчанию, которые являются вызовами функций?

У меня есть некоторый заголовок с функцией:

int foo(int x, int y = 0);

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

int foo(int x, int y = bar());

Где bar() - это некоторая функция, которая генерирует значение по умолчанию на основе некоторых системных параметров.В качестве альтернативы прототип этой функции выглядел бы следующим образом:

int foo(int x, int y = baz.bar());

Где baz - это функция, принадлежащая объекту, который не был создан в заголовочном файле.

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

Решение

Поди разберись!Это действительно работает. Аргументы по умолчанию в функциях C ++

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

Я бы использовал две перегруженные функции:

int foo(int x, int y);

int foo(int x){return foo(x,bar);}

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

ДА.То, что вы написали, работает.

Что плохого в том, чтобы просто удалить необязательный параметр в первом объявлении и предоставить перегрузку одним параметром?

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

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

В стандарте, раздел 8.3.6 (Аргументы по умолчанию), параграф 5, они приводят пример использования именно этого подхода.В частности, он указывает, что аргументами по умолчанию являются выражения, таким образом, применяется вызов функции, хотя и с такими ограничениями, как поиск имени и совместимость типов.

На моем рабочем месте мы использовали подобные подписи:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

чтобы позволить клиентам переопределять поведение в конструкторе класса.Это пригодилось для условного поведения, которое влияло на производительность переводчика...

По касательной, но мне кажется, что в будущем это приведет к возникновению проблем с зависимостью.Я бы выбрал подход stbuton.myopenid.com.

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

Попробуйте сделать bar() статической функцией-членом.Это позволит любой части программы, которая имеет такой статический класс в области видимости, получить к нему доступ.Например:

класс Foo { общедоступный:

статическая строка ввода ();};

Тогда вы бы заявили:

int foo(int x, int y = Foo::bar());

Если вам нужны разные объекты, то передайте вместо них экземпляр объекта.

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