Я хочу выдать ошибку типа компиляции с пользовательским сообщением для шаблона функции, если не найдена допустимая перегрузка.
Этот код работает, но я хотел бы удалить избыточность (с моей точки зрения) 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.