I just figured out half of my frustration is caused by a
collision between the 'alias this'd template possibillity and the
normal one.
For example:
struct Bar(uint size, V) {
V[size] blup;
alias blup this;
}
void foo(S : T[], T)(S a) {
pragma(msg, "first");
}
void foo
On 1/17/21 3:41 PM, Paul wrote:
On Sunday, 17 January 2021 at 16:42:27 UTC, Steven Schveighoffer wrote:
This works:
void TFoo(T : U[], U)(T a)
Oh cool, that's surprising to say the least. Thanks! This indeed works
with argument deduction :)
It's basically saying if T matches the pattern
On Sunday, 17 January 2021 at 16:42:27 UTC, Steven Schveighoffer
wrote:
I've always hated that aspect of specialization. I don't really
understand why it's valid (how can T be T[]?)
I totally agree with that, that confuses me as well.
This works:
void TFoo(T : U[], U)(T a)
Oh cool, that's
On 1/17/21 11:22 AM, Paul wrote:
While trying to use template specializations I noticed the argument
deductions do not yield the same version as the ones yielded when being
explicit.
Example:
uint a = 1;
uint[] b = [2];
TFoo(a);
TFoo!(uint[])(b);
void TFoo(T)(T a) {
pragma(msg, "T: " ~
While trying to use template specializations I noticed the
argument deductions do not yield the same version as the ones
yielded when being explicit.
Example:
uint a = 1;
uint[] b = [2];
TFoo(a);
TFoo!(uint[])(b);
void TFoo(T)(T a) {
pragma(msg, "T: " ~ T.stringof);
}
void TFoo(T :
On Sunday, 14 January 2018 at 02:24:52 UTC, Adam D. Ruppe wrote:
On Sunday, 14 January 2018 at 02:14:50 UTC, Jonathan M Davis
wrote:
If you're using template constraints rather than template
specializations, then you can't have any unconstrained
templates.
Not true: see the tip of the week he
On Saturday, January 13, 2018 19:32:06 Jonathan M Davis via Digitalmars-d-
learn wrote:
> On Sunday, January 14, 2018 02:24:52 Adam D. Ruppe via Digitalmars-d-learn
> wrote:
> > On Sunday, 14 January 2018 at 02:14:50 UTC, Jonathan M Davis
> >
> > wrote:
> > > If you're using template constraints ra
On Sunday, 14 January 2018 at 00:09:42 UTC, kdevel wrote:
The compiler does not allow me to specialize the primary
function template for double:
Yes, it does., and it works for float and double. Just `real`
matches both equally, so that's the error for that type. Let me
quote the spec:
http
On Sunday, January 14, 2018 02:24:52 Adam D. Ruppe via Digitalmars-d-learn
wrote:
> On Sunday, 14 January 2018 at 02:14:50 UTC, Jonathan M Davis
>
> wrote:
> > If you're using template constraints rather than template
> > specializations, then you can't have any unconstrained
> > templates.
>
> No
On Sunday, 14 January 2018 at 02:14:50 UTC, Jonathan M Davis
wrote:
If you're using template constraints rather than template
specializations, then you can't have any unconstrained
templates.
Not true: see the tip of the week here
http://arsdnet.net/this-week-in-d/2016-sep-04.html
On Sunday, January 14, 2018 01:02:46 kdevel via Digitalmars-d-learn wrote:
> On Sunday, 14 January 2018 at 00:30:37 UTC, Nicholas Wilson wrote:
> > The usual way to do what you are trying to do is with template
> > constraints.
> >
> > void foo(T)() if (is(T== float)) { ...}
>
> Thanks. That works
On Sunday, 14 January 2018 at 00:30:37 UTC, Nicholas Wilson wrote:
The usual way to do what you are trying to do is with template
constraints.
void foo(T)() if (is(T== float)) { ...}
Thanks. That works but looks a bit ugly. Am I right that I have
to leave out the primary (unconstrained) temp
On Sunday, 14 January 2018 at 00:09:42 UTC, kdevel wrote:
fusp.d
```
import std.stdio;
import std.typecons;
void foo (T) ()
{
writeln ("(1) foo T = ", T.stringof);
}
void foo (T : float) ()
{
writeln ("(2) foo T = ", T.stringof);
}
// void foo (T : double) ()
// {
//writeln ("(2) foo
not allow me to specialize the primary function
template for double:
$ dmd fusp.d
fusp.d(23): Error: fusp.foo called with argument types () matches
both:
fusp.d(9): fusp.foo!real.foo()
and:
fusp.d(14): fusp.foo!real.foo()
fusp.d(23): Error: foo!real has no effect
Is this a compile
Why is template param T != B but T == Rebindable!(const(B)) when
specialization is T : const(A)?
abstract class A{}
class B : A{}
string foo(T : const(A))(T x){
return T.stringof;
}
void main(){
import std.typecons : Rebindable;
import std.stdio : writeln;
Rebindable!(const B)
On Thursday, 24 November 2016 at 17:59:55 UTC, ag0aep6g wrote:
Took me a bit to find it, but it is documented:
"If both a template with a sequence parameter and a template
without a sequence parameter exactly match a template
instantiation, the template without a TemplateSequenceParameter
is
On Thursday, 24 November 2016 at 17:47:04 UTC, Steven
Schveighoffer wrote:
void foo(T)(T t){writeln("a");}
void foo(T...)(T t){writeln("b");}
foo(1);
Compiles? If so, which prints out?
I was surprised by the answer. I can't find docs for it. Is the
behavior intended?
-Steve
That is expect
On 11/24/2016 06:47 PM, Steven Schveighoffer wrote:
void foo(T)(T t){writeln("a");}
void foo(T...)(T t){writeln("b");}
foo(1);
Compiles? If so, which prints out?
I was surprised by the answer. I can't find docs for it. Is the behavior
intended?
Took me a bit to find it, but it is documented:
void foo(T)(T t){writeln("a");}
void foo(T...)(T t){writeln("b");}
foo(1);
Compiles? If so, which prints out?
I was surprised by the answer. I can't find docs for it. Is the behavior
intended?
-Steve
On 01/22/2016 07:41 AM, Darrell Gallion wrote:
Defining the template [specializations] within another function, fails.
Reported:
https://issues.dlang.org/show_bug.cgi?id=15592
Ali
On Friday, 22 January 2016 at 13:03:52 UTC, Darrell Gallion wrote:
On Friday, 22 January 2016 at 11:23:56 UTC, Marc Schütz wrote:
On Friday, 22 January 2016 at 01:33:42 UTC, Darrell Gallion
wrote:
void foo(A)()
if (!is (A == int)) {
pragma(msg, "int");
}
void foo(A)()
if (i
On Friday, 22 January 2016 at 13:03:52 UTC, Darrell Gallion wrote:
On Friday, 22 January 2016 at 11:23:56 UTC, Marc Schütz wrote:
On Friday, 22 January 2016 at 01:33:42 UTC, Darrell Gallion
wrote:
void foo(A)()
if (!is (A == int)) {
pragma(msg, "int");
}
void foo(A)()
if (i
On Friday, 22 January 2016 at 11:23:56 UTC, Marc Schütz wrote:
On Friday, 22 January 2016 at 01:33:42 UTC, Darrell Gallion
wrote:
void foo(A)()
if (!is (A == int)) {
pragma(msg, "int");
}
void foo(A)()
if (is (A == int[])) {
pragma(msg, "int[]");
}
void main() {
foo!
On Friday, 22 January 2016 at 01:33:42 UTC, Darrell Gallion wrote:
void foo(A)()
if (!is (A == int)) {
pragma(msg, "int");
}
void foo(A)()
if (is (A == int[])) {
pragma(msg, "int[]");
}
void main() {
foo!(int)();
foo!(int[])();
}
===
source\app.d(15): Erro
On Friday, 22 January 2016 at 00:08:56 UTC, Ali Çehreli wrote:
On 01/21/2016 03:37 PM, Darrell Gallion wrote:
How do you create a template that accepts many types.
But overrides just one of them?
Don't want to write out all of the specializations.
Hours of google and I'm sure it's simple...
-=
On 01/21/2016 03:37 PM, Darrell Gallion wrote:
How do you create a template that accepts many types.
But overrides just one of them?
Don't want to write out all of the specializations.
Hours of google and I'm sure it's simple...
-=Darrell
The straightforward approach is tricky because the ':
On Thu, Jan 21, 2016 at 11:37:34PM +, Darrell Gallion via
Digitalmars-d-learn wrote:
> How do you create a template that accepts many types.
> But overrides just one of them?
> Don't want to write out all of the specializations.
>
> Hours of google and I'm sure it's simple...
[...]
I'm afrai
How do you create a template that accepts many types.
But overrides just one of them?
Don't want to write out all of the specializations.
Hours of google and I'm sure it's simple...
-=Darrell
On 12/22/15 10:40 AM, Adam D. Ruppe wrote:
In specialization, it will implicitly convert, it will just select the
best match available.
Make #1:
void func(T : ubyte)(T v) { writeln(1); }
It will then use that for for the second line because it is a *better*
match than :int, but :int stil
On Tuesday, 22 December 2015 at 15:29:16 UTC, Shriramana Sharma
wrote:
1) At func(100) why isn't the compiler complaining that it is
able to match two templates i.e. the ones printing 2 and 3?
Because the specialized one just wins the context. It only
complains when there's two equal ones.
C
import std.stdio;
void func(T)(T v) { writeln(1); }
void func(T: int)(T v) { writeln(2); }
void func(T)(T v) if (is(T: int)) { writeln(3); }
void main()
{
func(100);
ubyte s = 200;
func(s);
}
The above code prints 2 twice. A fwe questions:
1) At func(100) why isn't the compiler compla
On Monday, December 21, 2015 19:54:53 Shriramana Sharma via Digitalmars-d-learn
wrote:
> Thanks all for your replies. One question:
>
> Jonathan M Davis wrote:
> > Alternatively, you can use static if, though you're only dealing
> > with one template in that case. e.g.
>
> But if we wanted to depr
Thanks all for your replies. One question:
Jonathan M Davis wrote:
> Alternatively, you can use static if, though you're only dealing
> with one template in that case. e.g.
But if we wanted to deprecate one of the alternatives, then we necessary
need to declare two templates with the same name a
On Monday, 21 December 2015 at 11:12:10 UTC, Jonathan M Davis
wrote:
On Monday, 21 December 2015 at 11:07:16 UTC, Jonathan M Davis
wrote:
For your example to work with template constraints, the most
straightforward solution would be
void func(T)(T t)
if(!isIntegral!T)
{
writeln(1);
}
On Monday, 21 December 2015 at 11:07:16 UTC, Jonathan M Davis
wrote:
For your example to work with template constraints, the most
straightforward solution would be
void func(T)(T t)
if(!isIntegral!T)
{
writeln(1);
}
void func(T)(T t)
if(isIntegral!T)
{
writeln(2);
}
Alternati
On Monday, December 21, 2015 15:14:20 Shriramana Sharma via Digitalmars-d-learn
wrote:
> Hello. I want to define a template specialization using traits:
>
> import std.stdio, std.traits;
> void func(T)(T t) { writeln(1); }
> void func(T)(T t) if(isIntegral!T) { writeln(2)
On Monday, 21 December 2015 at 09:44:20 UTC, Shriramana Sharma
wrote:
Hello. I want to define a template specialization using traits:
import std.stdio, std.traits;
void func(T)(T t) { writeln(1); }
void func(T)(T t) if(isIntegral!T) { writeln(2); }
void main()
{
func(1);
}
But I'm ge
Hello. I want to define a template specialization using traits:
import std.stdio, std.traits;
void func(T)(T t) { writeln(1); }
void func(T)(T t) if(isIntegral!T) { writeln(2); }
void main()
{
func(1);
}
But I'm getting an error saying that the called function matches both. If it
w
On 5/16/13, Jack Applegame wrote:
> Why this doesn't compile?
I think this is a bug.
This code compiles , as expected
struct A {
void func(string s : "foo")() {
pragma(msg, "func for foo");
}
void func(string s)() {
pragma(msg, "func for others: " ~ s);
}
}
void main() {
A a;
a.func!"foo"();
a.func!"bar"();
== Quote from Lars T. Kyllingstad (public@kyllingen.NOSPAMnet)'s article
> On Fri, 18 Feb 2011 02:02:51 +, Sean Eskapp wrote:
> > If I have
> >
> > class Bar(T)
> > {
> > }
> >
> > void foo(Y)()
> > {
> >...
> > }
> >
> > Is there a way to check inside foo() that Y is in some way an
> > ins
On Fri, 18 Feb 2011 02:02:51 +, Sean Eskapp wrote:
> If I have
>
> class Bar(T)
> {
> }
>
> void foo(Y)()
> {
>...
> }
>
> Is there a way to check inside foo() that Y is in some way an
> instantiation of Bar? Is there a way to find WHICH instantiation it is?
void foo(Y)()
{
static
If I have
class Bar(T)
{
}
void foo(Y)()
{
...
}
Is there a way to check inside foo() that Y is in some way an instantiation of
Bar? Is there a way to find WHICH instantiation it is?
bearophile wrote:
canalpay:
Thanks, But this example works:
void main()
{
T input(T)()
{}
}
Why ?
You are right. Beside allowing nested functions (this is well known), it seems
D2 also accepts the definition (with template constraint too) and instantiation
of simple templates insi
canalpay:
> Thanks, But this example works:
> void main()
> {
> T input(T)()
> {}
>
> }
>
> Why ?
You are right. Beside allowing nested functions (this is well known), it seems
D2 also accepts the definition (with template constraint too) and instantiation
of simple templates inside f
bearophile Wrote:
> In D2 you can't define templates inside functions.
>
> Bye,
> bearophile
Thanks, But this example works:
void main()
{
T input(T)()
{}
}
Why ?
canalpay:
> void main()
> {
> T input(T)()
> {}
>
> T input(T : string)()
> {}
> }
In D2 you can't define templates inside functions.
Bye,
bearophile
void main()
{
T input(T)()
{}
T input(T : string)()
{}
}
Error message :
isimsiz.d(6): found 'input' when expecting ';' following statement
isimsiz.d(6): found ':' when expecting ')'
isimsiz.d(6): found 'string' when expecting ';' following statement
isimsiz.d(6): found ')' inst
Library in D 2.0, but failed to do so
via
template specialization which is put into different modules. Putting
everything into one module interferes with extensibility. I tried the
following:
== Module a ==
| module a;
|
| template Base (T)
| {
| alias T Base;
| }
== Module b ==
| module b
On 06/28/2010 09:49 AM, Justin Spahr-Summers wrote:
> On Sun, 27 Jun 2010 18:51:35 +0200, Matthias Walter
> wrote:
>>
>> Hi list,
>>
>> I tried to write a traits class comparable to iterator_traits in C++ STL
>> or graph_traits in Boost Graph Library in D 2.0,
ts arises when I want to make an existing
class (who's code I cannot modify) match a Concept, in which case I
would just add another template specialization for this class. Here I
would have to add further conditions to the template constraints, which
would also mean to modify a library. A promin
On Sun, 27 Jun 2010 18:51:35 +0200, Matthias Walter
wrote:
>
> Hi list,
>
> I tried to write a traits class comparable to iterator_traits in C++ STL
> or graph_traits in Boost Graph Library in D 2.0, but failed to do so via
> template specialization which is put into differen
Matthias Walter wrote:
Can I handle this in another way (like making the template a conditional
one)?
Template constraints[1] sounds like what you want.
Basically, you want the following:
== Module a ==
| module a;
|
| template Base (T) if (!is(T t : t*))
| {
| alias T Base;
| }
== Modul
Hi list,
I tried to write a traits class comparable to iterator_traits in C++ STL
or graph_traits in Boost Graph Library in D 2.0, but failed to do so via
template specialization which is put into different modules. Putting
everything into one module interferes with extensibility. I tried the
Thanks everyone.
Please write one, overloading of functions with templates is an
important and basic thing.
http://d.puremagic.com/issues/show_bug.cgi?id=3941
Steven Schveighoffer:
> I know this is planned, because it's in TDPL. BTW, are there any bug
> reports for this?
Please write one, overloading of functions with templates is an important and
basic thing.
Bye,
bearophile
On Tue, 08 Jun 2010 17:25:43 -0400, Larry Luther
wrote:
This code:
import std.stdio;
class A {
void get (T:ubyte)(T[] buffer) {
writefln( "get (T:ubyte)(T[] buffer)\n");
}
void get (T:byte)(T[] buffer) {
writefln( "get (T:byte)(T[] buffer)\n");
}
void get (T)(T[] buffe
On Tue, 08 Jun 2010 17:25:43 -0400, Larry Luther
wrote:
This code:
import std.stdio;
class A {
void get (T:ubyte)(T[] buffer) {
writefln( "get (T:ubyte)(T[] buffer)\n");
}
void get (T:byte)(T[] buffer) {
writefln( "get (T:byte)(T[] buffer)\n");
}
void get (T)(T[] buffe
Larry Luther wrote:
Thanks guys.
Simen asked: "Is there a problem?".
Well, I kind of expected a "ubyte" buffer to be matched with a
"get(T:ubyte)".
I thought methods were searched for the "best" match.
No, C++ does it that way, and it gets horrendously complicated.
In D, it has to ma
Thanks guys.
Simen asked: "Is there a problem?".
Well, I kind of expected a "ubyte" buffer to be matched with a
"get(T:ubyte)".
I thought methods were searched for the "best" match.
Larry
On 06/08/2010 05:01 PM, Robert Clipsham wrote:
On 08/06/10 22:25, Larry Luther wrote:
Q: Is this the way it's supposed to be?
Yes, byte implicitly casts to ubyte so it's accepted. Try switching the
templates round, they will both be byte. The way around this is to add
template constraints to t
On 08/06/10 22:25, Larry Luther wrote:
Q: Is this the way it's supposed to be?
Yes, byte implicitly casts to ubyte so it's accepted. Try switching the
templates round, they will both be byte. The way around this is to add
template constraints to the templates:
void get(T:ubyte)(T[] buffer)
Larry Luther wrote:
get (T:ubyte)(T[] buffer)
get (T:ubyte)(T[] buffer)
get (T)(T[] buffer)
Q: Is this the way it's supposed to be?
Looks very much correct, yes. Is there a problem?
--
Simen
This code:
import std.stdio;
class A {
void get (T:ubyte)(T[] buffer) {
writefln( "get (T:ubyte)(T[] buffer)\n");
}
void get (T:byte)(T[] buffer) {
writefln( "get (T:byte)(T[] buffer)\n");
}
void get (T)(T[] buffer) {
writefln( "get (T)(T[] buffer)\n");
}
}
void main
On 02/01/2010 07:29 PM, Ali Çehreli wrote:
daoryn wrote:
> According to http://digitalmars.com/d/2.0/template.html it is
possible to specify template specialization so that DMD prefers them
when instanciating templates, however the following c
daoryn wrote:
> According to http://digitalmars.com/d/2.0/template.html it is
possible to specify template specialization so that DMD prefers them
when instanciating templates, however the following code:
>
>
> -
> import std.stdio;
>
>
On 02/01/2010 04:19 PM, daoryn wrote:
The whole point of specialisation (and of templates in general) is to have
functions that work for any type. Having to forcibly specify a type is like
casting to a specific overload of a function. Why add clutter to the syntax
when the language advertises
Tomek SowiÅski Wrote:
> Dnia 31-01-2010 o 21:39:21 Ali Ãehreli napisaÅ(a):
>
> > � wrote:
> >> Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski napisa�(a):
> >>
> >>> // specialization needed to limit matching types
> >>> void print(T:int)(T thing)
> >> To be clear -- I did this to silence t
it a compiler bug or misinterpreted template specialization?
y whether this belongs in bugzilla or not. It might.
>
> On 01/31/2010 12:49 PM, daoryn wrote:
>
> >
> > I expected it to output "calling print(T[])" on the second "print". Would
> > this be a bug or did I misunderstand the template specialization?
Daniel Murphy Wrote:
> daoryn Wrote:
>
> > According to http://digitalmars.com/d/2.0/template.html it is possible to
> > specify template specialization so that DMD prefers them when instanciating
> > templates, ho
Dnia 31-01-2010 o 21:39:21 Ali Çehreli napisał(a):
� wrote:
Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski napisa�(a):
// specialization needed to limit matching types
void print(T:int)(T thing)
To be clear -- I did this to silence the compiler saying the call with
array matches more than one
� wrote:
Dnia 31-01-2010 o 20:59:47 Tomek Sowi�ski napisa�(a):
// specialization needed to limit matching types
void print(T:int)(T thing)
To be clear -- I did this to silence the compiler saying the call with
array matches more than one function template declaration. I'm not sure
whether
Dnia 31-01-2010 o 20:59:47 Tomek Sowiński napisał(a):
// specialization needed to limit matching types
void print(T:int)(T thing)
To be clear -- I did this to silence the compiler saying the call with
array matches more than one function template declaration. I'm not sure
whether the comp
Dnia 31-01-2010 o 19:49:44 daoryn napisał(a):
import std.stdio;
void print(T)(T thing)
{
writeln("Calling print(T)");
writeln(T.stringof);
}
void print(T:T[])(T[] things)
{
writeln("Calling print(T[])");
writeln(T.stringof);
}
void main()
{
print(3);
ot;calling print(T[])" on the second "print". Would this
be a bug or did I misunderstand the template specialization?
daoryn Wrote:
> According to http://digitalmars.com/d/2.0/template.html it is possible to
> specify template specialization so that DMD prefers them when instanciating
> templates, however the following code:
>
>
> -
> import std.stdio;
According to http://digitalmars.com/d/2.0/template.html it is possible to
specify template specialization so that DMD prefers them when instanciating
templates, however the following code:
-
import std.stdio;
void print(T)(T thing)
{
writeln("Ca
79 matches
Mail list logo