Author: Mathieu Pagé
Date: 05:30:30 12/07/05
Go up one level in this thread
On December 07, 2005 at 00:49:53, Russell Reagan wrote: >On December 06, 2005 at 13:06:01, Zappa wrote: > >>Yes, but I have to write it twice :) That is my problem. > > >You don't have to write it twice if you use templates as generic function >generators. > > > >First establish a handful of color-specific operations. > >enum Color { white, black }; > >template <Color c> >unsigned shift_fwd (unsigned x, unsigned n) { > return x << n; >} > >template <> >unsigned shift_fwd<black> (unsigned x, unsigned n) { > return x >> n; >} > > > >Then write generic, color-blind code. > >// You write one, compiler generates two >template <Color c> >unsigned fwd_pawn_moves (unsigned x) { > return shift_fwd<c>(x, 8) & empty_squares; >} > > > >Now you have two functions, but you only wrote one. > >fwd_pawn_moves<white>(x); >fwd_pawn_moves<black>(x); > > > >You can propagate the template parameters from a higher level if you want. > >template <Color c> >int eval () { > // ... > > x = fwd_pawn_moves<c>(y); > > // ... >} > > > >For something this trivial, it may not be worth it. That's up to you, but >there's the idea he was going for. At some level you'd have to have an if-else, >switch statement, or whatever, but you'd do that anyway if you wrote two >functions, and you only have to do it once in your program and let the rest >propagate. > >if (side == white) > return eval<white>(); >else > return eval<black>(); > > > >Personally, I would just use some math and be done with it, as an extra shift >can't possibly be the bottleneck of your program. > >enum { white, black } > >unsigned shift_fwd (unsigned x) { > return (x << 8) >> (side * 16); >} Thank you Russel, you clarified my idea :)
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.