Suggestion: function template overloading
Kristian
kjkilpi at gmail.com
Tue Aug 29 12:10:07 PDT 2006
On Tue, 29 Aug 2006 21:44:35 +0300, Sean Kelly <sean at f4.ca> wrote:
> Kristian wrote:
>> On Tue, 29 Aug 2006 21:04:53 +0300, Sean Kelly <sean at f4.ca> wrote:
>>
>>> Kristian wrote:
>>>> It would be very nice if you could overload function templates as
>>>> you can in C++. Here is what I mean:
>>>> void f(T)(T val) {...}
>>>> void f(int val) {...} //error: conflicts with the template function
>>>> It would allow you to write special cases for types that need it.
>>>
>>> void f(T)(T val) {}
>>> void f()(int val) {}
>>>
>>>
>>> Sean
>> Ah, thanks! I missed _that_ one completely... :/
>> But now I can't get the following to work:
>> bool equal(T)(T l, T r) {
>> return l == r;
>> }
>> bool equal()(Foo l, Foo r) {
>> return l.m_val == r.m_val;
>> }
>> class Foo {
>> int m_val = 0;
>> }
>> class Bar(T) {
>> this() {
>> m_val = new T;
>> }
>> bool eq(T obj) {
>> return(equal(m_val, obj)); //error: matches more than one
>> template, equal(T) and equal()
>> }
>> T m_val;
>> }
>> void main() {
>> Bar!(Foo) bar = new Bar!(Foo);
>> Foo foo = new Foo;
>> printf("%d\n", bar.eq(foo));
>> }
>> It seems that 'binding' is done when 'Bar' is compiled, not when 'bar'
>> variable is declared.
>
> In this case, it should choose equal()( Foo ... ) over equal(T)( T ...)
> because the Foo overload is the most specialized for the supplied
> parameters. Unfortunately, implicit template support in DMD is still
> pretty thin so you're probably running into a compiler limitation rather
> than a problem with the spec. Instead of:
>
> equal()( Foo l, Foo r )
>
> try:
>
> equal( T : Foo )( Foo l, Foo r )
>
> and see what happens. I've found that with a bit of experimentation
> (and perhaps some wrapper code) you can usually get ITI to work as
> desired, and simply remove the work-around code as DMD improves.
>
>
> Sean
Ok, thanks again!
More information about the Digitalmars-d
mailing list