Вызов функции как параметр по умолчанию — можно ли использовать другие параметры в посадочном месте?

Предположим, у меня есть следующая функция, значение, которое она производит, необходимо многим другим функциям в коде:

float mean(foo param1, bar param2);

Другие мои функции выглядят так:

float foobar(foo param1, bar param2, float meanValue);

Я хочу сделать следующее:

float foobar(foo param1, bar param2, float meanValue = mean(param1, param2));

Хотя передача функции в качестве параметра по умолчанию является законной, компилятор (VS2008) жалуется, что param1 и param2 не объявлены, потому что параметры помещаются в стек правильно- влево, начиная с meanValue. Конечно, я не могу изменить порядок параметров, так как в этом случае я не смогу указать значение по умолчанию для первого параметра.

Я мог бы передать какое-то значение, например -10000, для среднего значения, чтобы сказать себе вызвать функцию mean(); или я мог бы перегрузить каждую функцию (а их более 10), но это не очень удобно. Я думаю, что это действительно здорово, что вы можете вызывать функцию в качестве параметра по умолчанию, и мне интересно, есть ли изящный способ выполнить то, что я пытаюсь сделать.


person autonomy    schedule 04.01.2012    source источник


Ответы (1)


В каком порядке параметры помещаются в стек, помещаются ли они вообще и есть ли вообще стек в архитектуре, стандарт C++ не определяет.

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

template< typename T1, typename T2 >
float foobar(T1 param1, T2 param2)
{
    return foobar(param1, param2, mean(param1, param2));
}

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

person sbi    schedule 04.01.2012