@kq @MarekR22 @vpiotr chyba głównie do Was ale wszystkich innych oczywiście zachęcam.
Przy okazji moich zabaw z innymi tematami, skonstatowałem, że może od razu ugryzę temat templatek i konceptów. Że siedzę na dość "bleeding-edge" systemie, to od razu C++20, bo nowe gcc dostępne od ręki.
Jako, że musiałem ostatnio sporo plików czytać, wysmażyłem taki twór:
template <typename T, typename C>
concept InputStream = std::is_base_of_v<std::basic_istream<C>, T>;
template<typename T, typename C=char, typename IS=std::basic_istream<C>>
requires (std::is_trivial_v<T> && InputStream<IS, C>)
T binary_read(IS& in)
{
T ret;
std::array<C, sizeof(T)/sizeof(C)> arr;
static_assert (sizeof(T) == arr.size()*sizeof(C), "Buffer and output size have to match");
in.read(&arr[0], arr.size());
std::memcpy(std::addressof(ret), &arr[0], sizeof(ret));
return ret;
}
template <std::size_t N, typename C=char, typename IS=std::basic_istream<C>>
requires (InputStream<IS, C>)
std::array<C, N> binary_read(IS& in)
{
std::array<C, N> arr;
in.read(&arr[0], arr.size());
return arr;
}
Zasadniczo to ten kod robi co chcę, pytanie czy nie można lepiej?