Help with Template Code
Daniel Keep
daniel.keep.lists at gmail.com
Fri Mar 30 20:54:33 PDT 2007
John Demme wrote:
> Jarrett Billingsley wrote:
>
>> "John Demme" <me at teqdruid.com> wrote in message
>> news:eukg7o$m31$1 at digitalmars.com...
>>> Hey all!
>>>
>>> There's a particular problem I'm trying to solve using templates. I
>>> don't see a reason that the compiler couldn't do this, but I'm not
>>> certain I can do it with templates yet.
>>>
>>> Here's a slightly simplified pseudo-code-ish version of what I want to
>>> do:
>>>
>>> T inst(T : struct)(T.tupleof t);
>>>
>>> Yes- this makes no sense, so let me describe. I want to create a
>>> templated
>>> function wherein the template argument is a struct... OK, that's easy.
>>> Next, I want the parameters of the function to be the types in the
>>> struct. For example, if I have the following struct:
>>> struct Foo {
>>> int a;
>>> float b;
>>> }
>>>
>>> then the following call:
>>> Foo f = inst!(Foo)(5, 8.26)
>>> would pass the Tuple!(int,float)(5, 8.26) into the inst function. No,
>>> it's
>>> not OK to add stuff so the calling code, but the inst function can be as
>>> ugly as necessary.
>>>
>>> I feel like this should be possible, but I don't know how... Any ideas?
>>>
>>> Thanks
>>>
>>> --
>>> ~John Demme
>>> me at teqdruid.com
>>> http://www.teqdruid.com/
>> Wow!
>>
>> struct S
>> {
>> int x;
>> float y;
>> char[] z;
>>
>> static S opCall(typeof(S.tupleof) args)
>> {
>> S s;
>>
>> foreach(i, arg; args)
>> s.tupleof[i] = arg;
>>
>> return s;
>> }
>> }
>>
>> void main()
>> {
>> S s = S(1, 2.3, "hi");
>> writefln(s.x);
>> writefln(s.y);
>> writefln(s.z);
>> }
>>
>> I really didn't think I would be able to write that.
>
> Ahh!!! typeof! That does it for me... much thanks. BTW, with your example
> above, you could probably turn that opCall into a mixin... It'd be a nice
> little mixin to have in Tango and/or Phobos.
>
> I've got one more template problem, but I'm pretty sure I can't do this. I
> now want to access the names of the struct's fields so that I could, for
> example, make a templated function that accepts a struct and prints
> name:value pairs for all the fields. Is there any way I can do this? (If
> so, I'm gonna be really, really impressed.)
>
> Thanks again
Not directly. The way I'm going to solve this problem is to have a
convention that any struct whose I want to be able to access by name
should have a 'fieldsof' property. This will be a tuple of strings that
name the fields in the order they appear in the struct. So, for your
example:
struct Foo
{
alias Tuple!("a","b") fieldsof;
int a;
float b;
}
In that case, Foo.fieldsof[i] is the name of the field Foo.tupleof[i].
Would be nice to have this built-in, but it's not a big drama.
-- Daniel
--
int getRandomNumber()
{
return 4; // chosen by fair dice roll.
// guaranteed to be random.
}
http://xkcd.com/
v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D
i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
More information about the Digitalmars-d-learn
mailing list