Да, это, конечно, возможно в этом случае. На самом деле, вы даже можете избежать написания if
и while
дважды.
Обратите внимание, что единственное различие между фрагментами кода заключается в , который Node
элемент используется (т.е. вы разветвляетесь влево или вправо). Таким образом, в зависимости от того, какой ветке вы хотите следовать, вы можете взять указатель на этот член, например:
Node* Node::* branch = node->left != nullptr ? &Node::left : &Node::right;
, а затем безоговорочно следовать этой ветви, например:
while (node->*branch != nullptr)
node = node->*branch;
В общем случае, когда у вас есть два одинаковых фрагмента кода, вы должны в каждом конкретном случае решать, какие его части можно абстрагировать, и будет ли улучшенный в результате код улучшен или нет.