Я пытаюсь сделать мой класс конвертируемым в любой тип перечисления.
enum dst_1 { /*...*/ };
enum dst_2 { /*...*/ };
class src { /*...*/ };
src s;
dst_1 d1 = s;
dst_2 d2 = s;
Я не хочу вручную добавлять преобразования для каждого типа перечисления, поэтому следующее не являетсяприемлемое решение:
// OK, but tedious - you must consider each enum type
class src
{
public:
operator dst_1() const { /*...*/ }
operator dst_2() const { /*...*/ }
// ...
};
Выполнение преобразования шаблона не работает для параметра шаблона не может быть выведено :
// NOT OK: T cannot be deduced
class src
{
public:
template< typename T > using Enum = enable_if_t< is_enum_v< T >, T >;
template< typename T > operator Enum< T >() const { /*...*/ }
};
Единственное решение Iможет найти это шаблон с переменным числом , но мне он не нравится, так как он заставляет пользователя указать перечисления, которые он планирует использовать:
// ALMOST OK, but still tedious - you must know in advance what enums will be used
src< dst_1, dst_2 > s;
dst_1 d1 = s;
dst_2 d2 = s;
Итак, есть лилучшее решение? В идеале я хотел бы написать:
src s;
dst_1 d1 = s;
dst_2 d2 = s;