Need assistance translating this C++ template

John via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Oct 27 16:39:43 PDT 2014


On Monday, 27 October 2014 at 23:19:42 UTC, anonymous wrote:
> On Monday, 27 October 2014 at 22:43:23 UTC, John wrote:
>> The C++ code:
>>
>> // Bitfield utilities
>> template<unsigned bitno, unsigned nbits=1, typename T=u8>
>> struct RegBit
>> {
> [...]
>>    template<typename T2>
>>    RegBit& operator=(T2 val)
> [...]
>> };
>>
>> My D implementation thus far:
> [...]
>> template RegBit(uint bitno, uint nbits = 1, T = u8) {
>
> You're missing the struct here. Add some (template) parameters 
> to
> a struct, and it becomes a struct template:
>
> struct RegBit(uint bitno, uint nbits = 1, T = u8)
>
> [...]
>>    // FIXME: Nested template frustration here... HELP
>>    void opAssign(T2 val)
>
> Similarly, add another set of (template) parameters to a
> function/method, before the runtime parameters, and it becomes a
> function/method template:
>
>      void opAssign(T2)(T2 val)
>
> [...]
>> }
>
> Those "slap another set of parameters on, and it's a template"
> syntaxes, are sugar for the longer "eponymous member" variant:
>
> struct Foo(T) {}
>
> is equivalent to
>
> template Foo(T)
> {
>      struct Foo /* same name as the template */
>      {
>          /* ... */
>      }
> }
>
> Works with structs, classes, functions, etc.
>
> So if you wanted to spell the templates out, it would look like
> this:
>
> template RegBit(uint bitno, uint nbits = 1, T = u8)
> {
>      struct RegBit
>      {
>          /* ... other members of RegBit ... */
>          template opAssign(T2)
>          {
>              void opAssign(T2 val)
>              {
>                  /* ... implementation of opAssign ... */
>              }
>          }
>          /* ... other members of RegBit ... */
>      }
> }

Much appreciated! I saw I didn't even make it a struct shortly 
after posting, time to take a nap and restrain the caffeine 
intake. And thanks for the missing parameter, Justin.


More information about the Digitalmars-d-learn mailing list