Существуют и другие альтернативы, если вы хотите изменить интерфейс. Вы можете использовать boost::optional
:
// untested:
void foo( boost::optional<int> val = boost::optional<int>() ) {
int value;
if ( val ) value = *val;
else value = m_val;
// Now use `value` in the function
}
Если вы не можете использовать boost, вы можете написать свою собственную обнуляемую оболочку. Вам просто нужно сохранить тип (int
) и флаг, который определяет, установлен он или нет.
Следующая опция использует указатель, чтобы отметить, что аргумент является необязательным:
void foo( int *pval = 0 ) {
int value = (pval? *pval : m_val);
// use value from here on
}
Но опция с указателем запрещает использование rvalues в качестве аргументов функции (т. Е. Вам нужна правильная переменная для вызова функции, вы не можете сделать foo(1)
, а скорее нужно int x = 1; foo( &x );
, что является болью).
Наконец, вы можете использовать свой подход, предлагая две перегрузки, одна из которых принимает аргумент, а другая - нет, и просто переходит к первой:
void foo( int val ) {
// actual implementation
}
void foo() {
foo( m_val );
}
Это может быть лучшим вариантом ...