Как определить возвращаемое значение функции, выбрав возможные варианты во время компиляции - PullRequest
2 голосов
/ 07 марта 2019

У меня есть две практически идентичные функции, которые получают ту же структуру, что и параметр.Очень упрощенная версия моих функций, как показано ниже:

struct Container {
 int A;
 int B;
}

int return_A_dependent(Container c){
  //... identical code for A and B ...
  int common_for_A_and_B = 0;
  return common_for_A_and_B + c.A;
}

int return_B_dependent(Container c){
  // ... identical code for A and B ...
  int common_for_A_and_B = 0;
  return common_for_A_and_B + c.B;
}

Единственная разница между двумя функциями заключается в их возвращаемых значениях, которые зависят от различных переменных структур.Я хочу объединить эти две функции без проверки во время выполнения.Например, передать параметр flag и добавить оператор if для пересылки возвращаемого значения, как показано ниже:

int return_A_or_B(Container c, bool flag_A) {
 // ... identical code for A and B ...
  int common_for_A_and_B = 0;
  if (flag_A) {
    return common_for_A_and_B + c.A;
  }
  else {
    return common_for_A_and_B + c.B;
  }

Как я могу обработать это во время компиляции, не используя «if»?Заранее спасибо.

1 Ответ

2 голосов
/ 07 марта 2019

шаблон, использующий указатель на член в качестве параметра (или просто обычную функцию с дополнительным аргументом):

template<int Container::* p_member> int
Work(Container c)
{
    int common_for_A_and_B = 0;
    return common_for_A_and_B + c.*p_member;
}

Work<&Container::A>(c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...