2015-11-19 2 views
1

Привет, Я пытаюсь справиться с функторами. Вот простой примерfunctor overloading best practices

struct A { 
double b,c; 
A(const double bb, const double cc) : b(bb), c(cc) {} 
double operator()(const double x, const double y) { 
    return b*c*x*y; 
} 
}; 

Я хотел бы знать, если это возможно перегружать А такой, что он может быть передан b, c, а также, например, x повторное использование кода в operator(). Мой общий интерес - не переписывать длинный код в операторы несколько раз и лучше понимать лучшие практики для этого.

Спасибо!

+1

Не следует использовать 'b (bb), c (cc)' be 'b (b), c (c)'? – Galik

+0

Пропустить 'a'? Что/где это? – Chad

+0

@Chad Я имел в виду 'b',' c' или 'x' – fen

ответ

0

Я хотел бы знать, можно ли перегрузить A так, чтобы его можно было передавать b, c, а также, например, x повторное использование кода в operator().

Да, это не сложно сделать.

double operator()(double x, double y) // Remove the const. It's useless. 
{ 
    // Call the other overload using the member data. 
    return (*this)(b, c, x, y); 
} 

double operator()(double bb, double cc, double x, double y) 
{ 
    // Not using any member data at all. 
    return bb*cc*x*y; 
} 
+0

@R Sahu Ваше решение работает в моем коде. Большое спасибо за то, что вы пришли прямо к делу и, в частности, ответили на заданный вопрос! – fen

0

Один из способов сделать это с std::bind в <functional>. Это возвращает замыкание, которое вы можете вызывать без аргументов. В качестве альтернативы можно создать новый конструктор с аргументами по умолчанию для a и b, или производного класса, и перегружать его иметь:

double operator()(const double x = m_x, const double y = m_y); 

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