Есть ли способ использовать Ошибка замещения - это не ошибка (SFINAE) для enum?
template <typename T>
struct Traits
{
}
template <>
struct Traits<A>
{
};
template <>
struct Traits<B>
{
enum
{
iOption = 1
};
};
template <T>
void Do()
{
// use Traits<T>::iOption
};
Тогда Do<B>();
работает и Do<A>();
не срабатывает.Тем не менее, я могу предоставить поведение по умолчанию, когда iOption не существует.Поэтому я выделяю некоторую часть Do to DoOption.
template <typename T, bool bOptionExist>
void DoOption()
{
// can't use Traits<T>::iOption. do some default behavior
};
template <typename T>
void DoOption<T, true>()
{
// use Traits<T>::iOption
};
template <T>
void Do()
{
// 'Do' does not use Traits<T>::iOption. Such codes are delegated to DoOption.
DoOption<T, DoesOptionExist<T> >();
};
Теперь недостающий фрагмент - DoesOptionExist<T>
- способ проверить, существует ли iOption в структуре.Конечно, SFINAE работает для имени функции или сигнатуры функции, но не уверен, что он работает для значения enum.