On Sat, 2006-07-29 at 23:14 +1000, Erik de Castro Lopo wrote:
Lars Luthman wrote:
The 4 different overloaded versions of the read,
readf, write, and
writef functions will cause ambiguities that will force you to cast them
to their respective types in order to use pointers to them, for example
in functors (e.g. a sigc++ slot), like this:
mem_fun(sndobj, (sf_count_t (Sndfile::*)(float*,
sf_count_t))&Sndfile::read);
If they were specialisations of the same template functions instead,
with the sample type as template parameter, you'd only have to write
this:
mem_fun(sndobj, &Sndfile::read<float>);
which is a lot nicer and easier to read.
Interesting use case.
I'm not even close to being an expert in C++ templates, but
I suppose that read function would then be defined as something
like:
template <T> sf_count_t read (T *ptr, sf_count_t items) ;
SO how do I ensure that <T> only gets specialised as short,
int, float and double?
class Sndfile {
...
template <typename T> sf_count_t read (T *ptr, sf_count_t items);
...
};
template <> sf_count_t Sndfile::read<short>(short* ptr, sf_count_t
items) { ... }
template <> sf_count_t Sndfile::read<int>(int* ptr, sf_count_t items)
{ ... }
template <> sf_count_t Sndfile::read<float>(float* ptr, sf_count_t
items) { ... }
template <> sf_count_t Sndfile::read<double>(double* ptr, sf_count_t
items) { ... }
...and nothing more. If you don't have a generic implementation anyone
who tries to instantiate the template with an unsupported type will get
a compilation error.
I don't think there is a way to actually prevent someone else from
writing a generic implementation or a different specialisation in their
own source, but if they try that they should _really_ know what they are
doing.
--
Lars Luthman - please encrypt any email sent to me if possible
PGP key:
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x04C77E2E
Fingerprint: FCA7 C790 19B9 322D EB7A E1B3 4371 4650 04C7 7E2E