On Wed, Jun 2, 2010 at 9:05 AM, Paolo Bonzini <bonz...@gnu.org> 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.

Reply via email to