2012-06-12 2 views
2

Я пишу функцию приближения, принимая два различных значения допуска в качестве параметров:Лучший дизайн, чтобы избежать «локальной переменной как параметра по умолчанию»?

bool Approximate(vector<PointC*>* pOutput, LineC input, double horizontalTolerance, double verticalTolerance) 

Я хочу, чтобы функция установить verticalTolerance = horizontalTolerance если verticalTolerance не установлен. Итак, я хочу сделать что-то вроде:

bool Approximate(vector<PointC*>* pOutput, LineC input, double horizontalTolerance, double verticalTolerance=horizontalTolerance) 

Я знаю, что это невозможно, потому что local variables are not allowed as default parameters. Поэтому мой вопрос в том, как лучше всего разработать эту функцию?

варианты я думал, являются:

  1. Не используйте параметр по умолчанию и сделать пользователю установить оба допуски в явном виде.

  2. Установленное значение по умолчанию verticalTolerance до отрицательного значения и сбрасывается в horizontalTolerance если отрицательна:

    bool Approximate(vector<PointC*>* pOutput, LineC input, double horizontalTolerance, double verticalTolerance=-1) 
    { 
        if (verticalTolerance < 0) 
        { 
         verticalTolerance = horizontalTolerance; 
        } 
        // Rest of function 
    } 
    

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

+2

Возможно использование перегрузки функций – marcinj

ответ

7

Или вы можете использовать перегрузку:

bool Approximate(vector<PointC*>* pOutput, LineC input, 
        double horizontalTolerance, double verticalTolerance) 
{ 
//whatever 
} 

bool Approximate(vector<PointC*>* pOutput, LineC input, 
        double tolerance) 
{ 
    return Approximate(pOutput, input, tolerance, tolerance); 
} 

Это отлично имитирует то, что вы хотите достичь.

+0

@ n.m. thx для редактирования. –

+0

+1, но я бы nitpickingly назвал единственный параметр допуска «допуск», который был не только горизонтальным. – molbdnilo

+0

@molbdnilo ты прав. –