У меня есть вопрос, на который можно было ответить более 9000 раз, но я действительно не знаю, как это выразить, вот что я собираюсь попробовать.
Я видел в некоторых книгах и руководствах по C ++, что при определении собственного класса, который имеет семантику итеративных значений (с приращением), вы можете перегрузить operator++
для этого (все, что я собираюсь здесь изложить, я думаю, относится и к operator--
). Стандартный способ сделать это выглядит так:
class MyClass {
public:
MyClass& operator++ () {
increment_somehow();
return *this;
}
....
};
Где increment_somehow()
ну ... как-то увеличивает значение объекта.
Тогда можно определить постфиксную версию operator++
таким образом:
MyClass operator++ (MyClass& it, int dummy) {
MyClass copy(it);
++it;
return copy;
}
Все хорошо и прекрасно (я думаю, что я правильно понял эту идиому), но проблема в том, что выполнение всего этого для каждого класса, который определяет operator++
, быстро становится утомительным и многословным, поэтому я подумал, что могу взять немного Преимущество трюка, который я недавно узнал при перегрузке операторов. То есть, используя заголовок <utility>
и средство под названием rel_ops
, о котором я узнал вчера (я только что вернулся на C ++ после четырех лет отсутствия ...):
class MyClass {
public:
bool operator== (const MyClass& that) {
return compare_for_equality_somehow(that);
}
bool operator< (const MyClass& that) {
return compare_for_lessality_somehow(that);
}
....
using namespace std::rel_ops; // operators >, >=, <=, ! are "magically" defined!
};
(Я только что изобрел термин «меньшинство» для целей аналогии, моя голова почему-то отказывается придумать правильный математический термин ...)
Я создал простой заголовок <step_ops.hpp>
, содержимое которого несколько имитирует пространство имен std::rel_ops
, найденное в заголовке Utility. Что я вижу после нескольких компиляций, это просто работает (ТМ). Могу ли я / я должен использовать этот трюк? С какими возможными ловушками я мог бы столкнуться, если бы я создал класс и использовал using namespace MyLibrary::increment_operators
(например)?
И, может быть, намного, гораздо важнее: Я только что заново изобрел колесо или просто создал небольшую полезную библиотеку, которая может быть объединена для подобных проектов ? Практически все эксперименты, которые я пытался провести с C ++, чтобы вернуть себя к скорости и совместной работе, похоже, уже покрыты boost::do_something
возможностью, и мне немного грустно, что я провел так много времени .