Czy jest jakiś sposób zeby połączyć w czasie kompilacji dwa typy wyliczeniowe o róznej kolejnosci?
Oczywiście, że tak. Najprościej (najmniej pisania) będzie to zrobić w C++14 przy pomocy constexpr
, np. tak:
enum one
{
a = 1,
b,
c,
d,
};
enum two
{
B = 1,
C,
D,
A,
};
constexpr two enum_converter(one value)
{
switch (value)
{
case a: return A;
case b: return B;
case c: return C;
case d: return D;
// dodaj sobie static_assert na default
}
}
int main()
{
constexpr one aaa = a;
constexpr two AAA = enum_converter(aaa);
std::array<int, AAA> lol; // sprawdzamy, czy na pewno działamy w compilation time
return 0;
}
Jeśli nie możesz użyć C++14 to niestety nie będziesz mógł użyć switcha i wielu returnów w funkcji constexpr
. Możesz to za to zrobić następująco:
- Zdefiniować długi łańcuch
?:
z jednym returnem (to brzydkie rozwiązanie)
- Zastąpić funkcję
constexpr
template z jawną specjalizacją dla każdej wartości z enuma one
.
Btw, uwaga na boku - o ile możesz używaj scoped enum zamiast unscoped.