Оберните класс перечисления, чтобы стереть типC++

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

Сообщение Anonymous »

Предположим, у меня есть несколько разных классов перечислений. Кроме того, у меня есть общий обработчик, который может работать со значениями int.
Как я могу обернуть свои перечисления, чтобы их можно было использовать с обработчиком? Сам обработчик может не быть шаблонным.
У меня есть рабочий пример, в котором используются 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 ... erase-type
Ответить

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

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

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

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

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