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
signature.asc
Description: This is a digitally signed message part
