Как я могу использовать std :: enable_if в операторе преобразования?

По сути, я хочу, чтобы мой тип диапазона был неявно конвертируемым из Range<const char> в Range<const unsigned char>, std :: enable_if кажется невозможным, потому что функция не принимает аргументов и не имеет возврата. Какая работа вокруг?

Вот в основном то, что я пытался:

template<typename T>
class Range{
T* begin_;
T* end_;
public:
Range(T* begin,T* end):begin_{begin},end_{end}{}
template<int N>
Range(T (&a)[N]):begin_{static_cast<T*>(&a[0])},end_{static_cast<T*>(&a[N-1])}{}
T* Begin(){return begin_;}
T* End(){return end_;}
operator typename std::enable_if<std::is_same<T,const char>::value,Range<const unsigned char>&>::Type (){
return *reinterpret_cast<Range<const unsigned char>*>(this);
}
};

5

Решение

Сделайте это шаблоном с фиктивным параметром, который по умолчанию равен T — это отложить вычитание типа до точки, где создается экземпляр функции, иначе SFINAE не работает. Затем вы делаете проверку, которую вы хотите в значении по умолчанию другого параметра.

template<
typename U = T,
typename = typename std::enable_if< std::is_same<U,const char>::value >::type
>
operator Range<const unsigned char>() {
return *reinterpret_cast<Range<const unsigned char>*>(this);
}
10

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector