Я видел комментарии или ответы на SoF о том, что перегрузка оператора трансляции на bool опасна, и вместо этого я должен предпочесть void* operator
. Тем не менее, я хотел бы спросить, является ли опасная практика использовать этот оператор в моем случае использования, и если да, то почему.Опасно ли перегружать оператор bool в этом случае
я реализую просто геометрия библиотеки и один из его самых основных классов является точка, что я определяю следующим образом:
struct point {
double x, y;
bool real;
point(double x_, double y_): x(x_), y(y_), real(true) {}
point(): x(0), y(0), real(true) {}
operator bool() {
return real;
}
};
Я попытаюсь объяснить, почему мне нужен оператор приведения к BOOL. У меня есть еще один класс называется линия, и я функция, объявленная следующим образом:
point intersect(const line& a, const line& b);
Теперь перегрузив оператор приведения к BOOL точки я могу написать как: point p = intersect(a,b);
и if (intersect(a,b))
таким образом, либо получать точку пересечения двух линий или проверить, пересекаются ли две линии. Я использую это и в других местах, но я считаю, что этого примера достаточно, чтобы показать использование оператора трансляции. Является ли мое использование оператора трансляции опасным, и если бы вы могли привести пример, когда эффект не будет таким, как ожидалось?
EDIT: одно небольшое дополнение благодаря juanchopanza: в этом проекте я ограничен не использованием C++ 11, поэтому я не могу сделать оператор явным.
Если у вас есть C++ 11, вы можете удалить опасность, сделав оператор трансляции «явным». – juanchopanza
@juanchopanza Я знаю, но я ограничен pre-'++ 11' –
Если вы не можете потрудиться, чтобы реализовать свой собственный' safe_bool', см. Этот ответ для набора, доступного в boost: http://stackoverflow.com/ вопросы/11781584/safe-bool-idiom-in-boost – Nim