Połączenie enum o róznej kolejnosci

0
    enum one
    {
        a = 1,
        b,
        c,
        d,
    };
    enum two
    {
        B = 1,
        C,
        D,
        A,
    };

    one aaa = one::a;
    two AAA = ? ; // Celem jest uzyskanie z 'a' 'A' 

Czy jest jakiś sposób zeby połączyć w czasie kompilacji dwa typy wyliczeniowe o róznej kolejnosci?

1

w czasie kompilacji raczej nie

ale co mozesz zrobic to uzyc mapy

http://www.cplusplus.com/reference/map/map/

3
Pijany Lew napisał(a):

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:
1) Zdefiniować długi łańcuch ?: z jednym returnem (to brzydkie rozwiązanie)
2) 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.

2

Rozwiązanie w czasie kompilacji dla C++98:

#include <iostream>
using namespace std;

enum one
{
    a = 1,
    b,
    c,
    d,
};

enum two
{
    two_undefined,
    B = 1,
    C,
    D,
    A,
};

template <int invalue>
class enum_converter {
public:
  static const two value = two_undefined;
};

template <>
class enum_converter<a> {
public:
  static const two value = A;
};

template <>
class enum_converter<b> {
public:
  static const two value = B;
};

template <>
class enum_converter<c> {
public:
  static const two value = C;
};

template <>
class enum_converter<d> {
public:
  static const two value = D;
};

int main() {
    one aaa = a;
    two AAA = enum_converter<a>::value;
    cout << "aaa:" << aaa << endl;
    cout << "AAA:" << AAA << endl;
    return 0;
}

http://ideone.com/RbpqPh

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0