Идеальный дизайн архитектуры для параметров пространства имен - PullRequest
0 голосов
/ 02 марта 2019

У меня есть 3 заголовочных файла

// a1.h
namespace a
{
  enum abc:uint8
  {
      abc1 = 1
      abc2 = 2
  };
}

// a2.h
namespace b
{
  enum abc:uint8
  {
      abc1 = 1
      abc2 = 2
      abc3 = 3
  };
}

// out.h
namespace out
{
  enum abc:uint8
  {
      abc1 = 1
      abc2 = 2
      abc3 = 3    
  };
}

Я хочу применить некоторую операцию dosomething(a::abc, &out::abc) или dosomething(b::abc, &out::abc) к перечислению, где я просто сопоставляю ввод из (a::abc или b::abc) с выводом(out::abc) используя операторы switch.Самым простым решением было бы написать две отдельные функции для разных пространств имен.

Мне интересно, можно ли шаблонизировать функцию dosomething, учитывая, что

  1. Значения перечисления одинаковы (количество значений перечисления одинаково, например, все имеют abc1, abc2)
  2. Значения перечисления различны (пространство имен b :: abc :: abc1 = 3, b :: abc :: abc2 = 4)
  3. Введено новое значение перечисления (например, b :: abc :: abc3)

Это позволило бы избежать дублирования кода и сделать проект расширяемым.

У меня есть ограничение, что я не могу изменять заголовочные файлы.

1 Ответ

0 голосов
/ 02 марта 2019

Это вполне выполнимо с static_cast, вам не нужна отдельная функция вообще:

a::abc A = a::abc2;
b::abc B = b::abc3;

a::abc A2 = static_cast<a::abc>(B);
cout << A << " " << A2 << " " << B;

Выходы 2 3 3, как и ожидалось.

https://www.ideone.com/pKltlP

...