Suppose I have
int foo(void* p, size_t size_in_bytes);
and assume it doesn't make sense to make foo
typed. I want to be a good coder and apply the C++ core guidelines. Specifically, I want to use spans instead of (*, len) pairs. Well, span<void>
won't compile (can't add to a void *
); and span<char>
or span<uint8_t>
etc. would imply foo actually expects chars, which it might not.
So should I use a span<something-with-size-1>
in this case, or stick with void*
?
What I chose to do, and what I think is, shall we say, sound design-wise, is implement a class named memory_region
, which has all of the type-inspecific functionality of gsl::span
(hence, for example, it doesn't have a begin() or an end()). It is not the same thing as a span of bytes, IMO - and I can structurally never get them mixed up.
Here's my implementation (it's part of a repository of DBMS-related GPU kernels and a testing framework I'm working on, hence the CUDA-related snippet; and it depends on some GSL, in my case gsl-lite by MS'es should be ok too I think).