я в настоящее время код следующего вида:C++ Повторные делать-если-делать шаблон
Do1(A);
if (B != null) Do1(B);
Do2(A, true);
if (B != null) Do2(B, true);
Do3(A);
if (B != null) Do3(B);
Так несколько раз, я исполняю что-то для объекта А, и если указан B, я делаю это для B Это означает, что весь мой код дублируется, и я хотел бы изменить его, но я не могу придумать хороший способ улучшить этот шаблон.
Единственная идея, которую я имел до сих пор что-то вроде
auto doBoth = [&A,&B](function<void(const T&)> f) {
f(A);
if (B != null) f(B);
};
doBoth(&Do1);
auto do2_bind = [](const T& obj) {Do2(obj, true);};
doBoth(do2_bind);
doBoth(&Do3);
, но я чувствую, что значительно сократило бы читаемость и сделать его более трудным для кого-то, чтобы понять мой код, так как это довольно абстрактная функция лямбда и много лямбдов в целом.
Редактировать: Из ответов и комментариев я вижу, что должен был внести некоторые разъяснения. Прошу прощения за путаницу.
А и В одного и того же типа и имеют что-то вроде Foo * или опционального < Foo>, которая позволяет тест на нуль
я могу использовать только C++ 11 особенности
Кодовые блоки (которые я сокращенно как DoN здесь) могут быть более сложными, чем просто один вызов функции. Например, если бы:
Do1(A); Do2(A); if (B != null) { Do1(B); Do2(B); }
где порядок операций важен.
C++ 17 lambdas с параметрами автоматической настройки должны сделать это намного приятнее. –
@BenVoigt: Это функция C++ 14. –
Не могли бы вы сделать это? 'template void DoAll (X x) { Do1 (x); Do2 (x, true); Do3 (x); } /* ... */ DoAll (a) if (b) DoAll (b); ' Или вызовы b зависят от побочных эффектов от вызовов? –
WaltK