Общее сопоставление класса перечисления с intC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Общее сопоставление класса перечисления с int

Сообщение Anonymous »

Предположим, у меня есть несколько разных классов перечислений. Кроме того, у меня есть общий обработчик, который может работать со значениями int. Обработчик находится на уровне пользовательского интерфейса, который нельзя использовать в качестве шаблона. Он использует перечисления, преобразованные в целочисленные значения, в качестве индекса в таблицах поиска (они гарантированно имеют нулевой индекс и последовательность). Кроме того, все возможные перечисления не известны заранее (сгенерированный код) на этом уровне связи.
Как я могу обернуть свои перечисления, чтобы их можно было использовать с обработчиком? Сам обработчик может не быть шаблонным.
Вот схема структуры:

Код: Выделить всё

// Ui Layer
class UiList {
public:
UiList(std::vector strings, ToBeDefinedIntLikeValue& index);

// called when underlying value changes
void updateUi()
{
displayString(mStrings[mIndex.get()]);
}

// called by UI, when user selects
void updateValue(int newIndex)a different string
{
mIndex.set(newIndex);
}
};

//////
// Generated code
enum class Colors { red, green, blue };
enum class Animals { cat, dog, goose };

//////
// Data layer
struct Storage{
Colors color;
Animals animal;
};

/////
// Coupling layer
template 
UiList createUiList(E& e, std::vector values) {
// Initialize UiList, so that it can convert the e values to indices
}

//// Usage
mUi.addList(createUiList(mStorage.color, {"red", "green",
"blue"});
mUi.addList(createUiList(mStorage.animal, {"cat", "dog", "goose"});

У меня есть рабочий пример, в котором используются std::function с лямбда-выражениями:

Код: Выделить всё

#include 

enum class E1 {
a,b,c
};
enum class E2 {
d,e,f
};

struct Wrapper
{
using Getter = std::function;
using Setter = std::function;

int get() const { return getter_(); }
void set(int v) { setter_(v); }

Getter getter_;
Setter setter_;
};

template 
auto createWrapper(E& e) {
return Wrapper{
[&e]{ return static_cast(e); },
[&e](int v) { e = static_cast(v); }
};
}

// This function cannot be templated
void handleValues(Wrapper w)
{
int i = w.get();
w.set(i*2);
}

int main()
{
E1 e1 = E1::a;
E2 e2 = E2::d;

handleValues(createWrapper(e1));
handleValues(createWrapper(e2));

}
Есть ли этому альтернатива? Особенно я ищу версию, которая не требует std::function (с указателями функций все в порядке).
Все мои попытки терпят неудачу, потому что я не могу найти способ сохранить фактическое перечисление для получения/установки, не фиксируя его в лямбда-выражении или не используя шаблон.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ass-to-int
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»