Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
June 12, 2013 Template Trick | ||||
---|---|---|---|---|
| ||||
Hello, I got a simple vector template : struct Vector(T, uint N) { alias type T; T data[N]; } And I'd like to call a function like : void func(V, V.type default_value)(args...); But this (of course) doesn't work. Is there a simple and nice way to do this ? (I'm sure there is ;-)) Thanks. |
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On Wed, Jun 12, 2013 at 11:26:40PM +0200, matovitch wrote: > Hello, > > I got a simple vector template : > > struct Vector(T, uint N) > { > alias type T; [...] This line should read: alias type = T; And it should work as you wanted. T -- If you look at a thing nine hundred and ninety-nine times, you are perfectly safe; if you look at it the thousandth time, you are in frightful danger of seeing it for the first time. -- G. K. Chesterton |
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to H. S. Teoh | On Wednesday, 12 June 2013 at 21:36:38 UTC, H. S. Teoh wrote:
> On Wed, Jun 12, 2013 at 11:26:40PM +0200, matovitch wrote:
>> Hello,
>>
>> I got a simple vector template :
>>
>> struct Vector(T, uint N)
>> {
>> alias type T;
> [...]
>
> This line should read:
>
> alias type = T;
>
> And it should work as you wanted.
>
>
> T
This was a mistake (it's quite late) :
alias T type;
|
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On 06/12/2013 02:26 PM, matovitch wrote:> Hello, > > I got a simple vector template : > > struct Vector(T, uint N) > { > alias type T; You later corrected that it should be alias T type; But still, prefer the new syntax over the backward C syntax: alias type = T; > T data[N]; > } > > And I'd like to call a function like : > > void func(V, V.type default_value)(args...); So, that function is already defined and you are trying to call it? How are you calling it? What is the error message? > But this (of course) doesn't work. Is there a simple and nice way > to do this ? (I'm sure there is ;-)) It is not clear to me what the purpose is. :) Ali |
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | To be more precise the code below doesn't compile : struct Vector(T, uint N) { alias T type; enum dimension = N; T data[N]; } void func(V, V.type def_val) (uint i, V v) { if (i < v.dimension) { v.data[i] = def_val; } } void main() { alias Vector!(int, 3) Vec3i; Vec3i v; func!(Vec3i, 42)(2, v); } With the error message : test.d(8): Error: no property 'type' for type 'V' test.d(8): Error: V.type is used as a type |
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On 06/12/2013 02:47 PM, matovitch wrote:
> To be more precise the code below doesn't compile :
>
> struct Vector(T, uint N)
> {
> alias T type;
> enum dimension = N;
> T data[N];
> }
>
> void func(V, V.type def_val) (uint i, V v)
> {
> if (i < v.dimension) {
> v.data[i] = def_val;
> }
> }
>
> void main()
> {
> alias Vector!(int, 3) Vec3i;
> Vec3i v;
> func!(Vec3i, 42)(2, v);
> }
>
> With the error message :
>
> test.d(8): Error: no property 'type' for type 'V'
> test.d(8): Error: V.type is used as a type
>
>
Here is one way:
void func(V, alias def_val) (uint i, V v)
if (is (typeof(def_val == V.type)))
{
if (i < v.dimension) {
v.data[i] = def_val;
}
}
Ali
|
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | On Wednesday, 12 June 2013 at 21:52:46 UTC, Ali Çehreli wrote:
>
> Here is one way:
>
> void func(V, alias def_val) (uint i, V v)
> if (is (typeof(def_val == V.type)))
> {
> if (i < v.dimension) {
> v.data[i] = def_val;
> }
> }
>
> Ali
Thank you !
|
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | matovitch: > void func(V, V.type def_val) (uint i, V v) > { > if (i < v.dimension) { > v.data[i] = def_val; > } > } I think something like that is not yet possible, but maybe it will be possible later. Your code has also allowed me to find a new small compiler bug that I have just filed: http://d.puremagic.com/issues/show_bug.cgi?id=10346 Bye, bearophile |
June 12, 2013 Re: Template Trick | ||||
---|---|---|---|---|
| ||||
Posted in reply to matovitch | On 06/12/2013 02:56 PM, matovitch wrote: > On Wednesday, 12 June 2013 at 21:52:46 UTC, Ali Çehreli wrote: >> >> Here is one way: >> >> void func(V, alias def_val) (uint i, V v) >> if (is (typeof(def_val == V.type))) Oops. It should be: if (is (typeof(def_val) == V.type)) Hmmm. How come the other one worked as well? Because the type of (def_val == V.type) is compiled as bool and since bool is a valid type, 'is' passes. >> { >> if (i < v.dimension) { >> v.data[i] = def_val; >> } >> } >> >> Ali > > Thank you ! Ali |
Copyright © 1999-2021 by the D Language Foundation