Thread overview
Template arg deduction
Jul 07, 2021
Kevin Bailey
Jul 07, 2021
Ali Çehreli
Jul 07, 2021
Paul Backus
Jul 07, 2021
Tejas
Jul 07, 2021
vit
July 07, 2021

I'm trying to use some fairly simple template argument deduction, but
maybe I'm not getting the syntax correct. C++ doesn't event blink at
something like this, but D is giving me:

temptest.d(18): Error: template temptest.func cannot deduce function from argument types !()(bar), candidates are:
temptest.d(10): func(T)(foo!T.bar f)

I guess D can't crack open a type like that?

template foo(T)
{
class bar
{
        T t;
}

}

void func(T)(            // 10
        foo!(T).bar f)
{
}

int main()
{
        foo!int.bar fi;
        func(fi);        // 18
}
July 07, 2021
On 7/7/21 12:14 PM, Kevin Bailey wrote:

> fairly simple template argument deduction

It's not the simplest but it is still complicated. :)

> I guess D can't crack open a type like that?

There are other ways of achieving the same thing the simplest of which is probably the following:

void func(B)(B f) {
}

Apparently, there are additional constraints on B, which can be expressed in D with some flexibility, pragmatism, and optimism.

Ali

July 07, 2021

On Wednesday, 7 July 2021 at 19:14:52 UTC, Kevin Bailey wrote:

>

I'm trying to use some fairly simple template argument deduction, but
maybe I'm not getting the syntax correct. C++ doesn't event blink at
something like this, but D is giving me:

temptest.d(18): Error: template temptest.func cannot deduce function from argument types !()(bar), candidates are:
temptest.d(10): func(T)(foo!T.bar f)

I guess D can't crack open a type like that?

https://issues.dlang.org/show_bug.cgi?id=22111

July 07, 2021

On Wednesday, 7 July 2021 at 19:14:52 UTC, Kevin Bailey wrote:

>

I'm trying to use some fairly simple template argument deduction, but
maybe I'm not getting the syntax correct. C++ doesn't event blink at
something like this, but D is giving me:

temptest.d(18): Error: template temptest.func cannot deduce function from argument types !()(bar), candidates are:
temptest.d(10): func(T)(foo!T.bar f)

I guess D can't crack open a type like that?

template foo(T)
{
class bar
{
        T t;
}

}

void func(T)(            // 10
        foo!(T).bar f)
{
}

int main()
{
        foo!int.bar fi;
        func(fi);        // 18
}
The following works:
```d
import std.stdio;
template foo(T)
{
class bar
{
        T t;
}

}

void func(T) (            // 10
        T f)               //  No need to repeat foo!(int).bar :)
{
}

int main()
{
        foo!(int).bar fi;//brackets added, now syntax is correct
        func(fi);        // 18. int couldn't get deduced here
    return 0;
}
```
July 07, 2021

On Wednesday, 7 July 2021 at 19:14:52 UTC, Kevin Bailey wrote:

>

I'm trying to use some fairly simple template argument deduction, but
maybe I'm not getting the syntax correct. C++ doesn't event blink at
something like this, but D is giving me:

temptest.d(18): Error: template temptest.func cannot deduce function from argument types !()(bar), candidates are:
temptest.d(10): func(T)(foo!T.bar f)

I guess D can't crack open a type like that?

template foo(T)
{
class bar
{
        T t;
}

}

void func(T)(            // 10
        foo!(T).bar f)
{
}

int main()
{
        foo!int.bar fi;
        func(fi);        // 18
}

This work:

template foo(T){
        class bar{
    		T t;
        }
    }

void func(alias F : foo!T, T)(F.bar f){
}

void main(){
    	
    foo!int.bar fi;
    func(fi);

}