Резервная перегрузка шаблона функции - PullRequest
0 голосов
/ 02 марта 2020

Я хочу выдать ошибку типа компиляции с пользовательским сообщением для шаблона функции, если не найдена допустимая перегрузка.

Этот код работает, но я хотел бы удалить избыточность (с моей точки зрения) enable_if_t<not is_integral_v<T>, в последнем Перегрузка.

using namespace std;
using byte_vector = vector<uint8_t>

template<typename T>
enable_if_t<is_integral_v<T>,
byte_vector&> operator<<(byte_vector&bv, T const& v){
//ToDo C++20 if constexpr (std::endian::native == std::endian::big)
#if BYTE_ORDER == LITTLE_ENDIAN
    std::reverse_iterator<uint8_t *> first{(uint8_t *) (&v + 1)}, last{(uint8_t *) (&v)};
#else
    uint8_t * first = (uint8_t*)&ui, last = (uint8_t*)(&ui+1)};
#endif
    bv.insert(end(bv), first, last);    
    return bv;
}
template<>
byte_vector& operator<<(byte_vector&bv, uint8_t const& v){
    bv.push_back(v);
    return bv;
}
/// Produce compile type error for non-integral types => easier to find what's wrong
template<typename T>
enable_if_t<not is_integral_v<T>,
byte_vector&> operator<<(byte_vector&bv, T const& v){
    static_assert(is_integral_v<T>,"operator<<(byte_vector&,T) implemented for integral types only");
}

Я планирую перейти на C ++ 20, но текущий стандарт - C ++ 17.

1 Ответ

3 голосов
/ 02 марта 2020

Вы можете просто добавить stati c assert к основному шаблону, например

template<typename T>
byte_vector& operator<<(byte_vector&bv, T const& v){
    // assert if not integral
    static_assert(is_integral_v<T>,"operator<<(byte_vector&,T) implemented for integral types only");
    // since it is, do the stuff
//ToDo C++20 if constexpr (std::endian::native == std::endian::big)
#if BYTE_ORDER == LITTLE_ENDIAN
    std::reverse_iterator<uint8_t *> first{(uint8_t *) (&v + 1)}, last{(uint8_t *) (&v)};
#else
    uint8_t * first = (uint8_t*)&ui, last = (uint8_t*)(&ui+1)};
#endif
    bv.insert(end(bv), first, last);    
    return bv;  
}

template<>
byte_vector& operator<<(byte_vector&bv, uint8_t const& v){
    bv.push_back(v);
    return bv;
}
...