On Wed, Jun 2, 2010 at 9:05 AM, Paolo Bonzini <[email protected]> wrote:
> On 06/02/2010 03:01 PM, Gabriel Dos Reis wrote:
>>
>> In the guidelines, I would like to include:
>> (2) if you define a class template used mostly with pointer type
>> arguments,
>> consider specializing for void* (or const void*) and define all
>> other
>> pointer specialization in terms of that.
>
> I have no idea what you're saying. :-) What do you mean by "define all
> other pointer specialization in terms of that"? Wouldn't specializing on T*
> just work?
yes, it would work, but it may duplicate same executable several times
for those concerned about code size.
Imagine a vector class template
template<typename T> struct Vec; // primary template
// specialize for T=void*
template<>
struct Vec<void*> {
void* get(int i) { .... }
// ...
};
// specialize all T* in terms of void*
template<typename T>
struct Vec<T*> : private Vec<Void*> {
typedef Vec<Void*> Impl;
// define all operations in as forwarding functions to Impl
T* get(int i) { return static_cast<T*>(Impl::get(i));
// and so on.
};
you only have one "ultimate" implementation, all others being simple inline
fowarding functions. This is for people concerned about code size.