void myFunc(T: !=int)(T value)

Steven Schveighoffer schveiguy at yahoo.com
Fri Aug 22 07:48:31 PDT 2008


"tsalm" wrote
> Le Fri, 22 Aug 2008 15:23:11 +0200, Steven Schveighoffer 
> <schveiguy at yahoo.com> a écrit:
>
>> "tsalm" wrote
>>> Le Fri, 22 Aug 2008 14:33:23 +0200, Jarrett Billingsley
>>> <kb3ctd2 at yahoo.com> a écrit:
>>>
>>>> -------------------------------------------
>>>> "tsalm" <tsalm at free.fr> wrote in message
>>>> news:op.ugacfwj7010shu at papillon.lan...
>>>> Hello,
>>>>
>>>> I want to do something like this :
>>>>
>>>> class MyClass
>>>> {
>>>>    void myFunc(int intValue)
>>>>    {
>>>>      /* Do something with this int */
>>>>    }
>>>>
>>>>    void myFunc(T: !=int)(T valueNotInt)
>>>>    {
>>>>      /* valueNotInt can not be an int */
>>>>    }
>>>> }
>>>>
>>>> Thanks in advance,
>>>> TSalm
>>>> -------------------------------------------
>>>>
>>>> void myFunc(T: int)(int intValue) {}
>>>> void myFunc(T)(T notIntValue) {}
>>>>
>>>> :)
>>>>
>>>
>>> In fact, the exact operator is :
>>>   int opCmp(MyStruct m)
>>>
>>> It must be use, when this struct is in an array, to sort this array
>>> And strangly, the method
>>>    int opCmp(T:MyStruct)(MyStruct m)
>>> is not take by ".sort"
>>> :(
>>
>> Ah, your problem is that template methods cannot be virtual.  .sort is
>> trying to use the virtual method int opCmp(Object) in Object.
>>
>> Overload with Object as the argument for the non-int function:
>>
>> int opCmp(Object o); // this will be used in .sort
>> int opCmp(int i);
>>
>> -Steve
>>
>>
>
> I don't explain myself clearly ...
>
> This problem concern a "bug" on tango :
> http://www.dsource.org/projects/tango/ticket/1259#preview
>
> Here's a better example :
>
> /***************************************/
>
> struct MyStruct
> {
>  int a;
>
>  // Must be use to sort this struct on an array
>  // but the compilation send a conflict with "opCmp(T)(T val)"
>  int opCmp(MyStruct m)
>  {
>    return a - m.a;
>  }
>
>  // I need this to compare with other objects
>  int opCmp(T)(T val)
>  { /* ... */}
>
> }
>
> void main()
> {
>  MyStruct a,b,c,d;
>  a.a = 5;
>  b.a = 1;
>  c.a = 10;
>  d.a = -1;
>
>  MyStruct[] array = [a,b,c,d];
>
>  array.sort;
>
>  foreach(el;array)
>  {
>   Stdout(el.a).newline;
>  }
>
> }
> /***************************************/

OK, I see what you mean.

The compiler has some special knowledge of opCmp for structs (and toString, 
etc.) What it does is if you define int opCmp(MyStruct x), the compiler 
flags it as being the compare function for the struct, and the function 
pointer for opCmp goes into the TypeInfo for the struct as xopCmp or 
something like that.  Then generic code can use the xopCmp sort of like a 
vtable pointer to compare two instances.

Apparently, if that opCmp is defined by a template, it doesn't store that 
version in the xopCmp function pointer.

As far as not compiling the above code, that is a limitation that is 
unlikely to change (overloading a member function with a template).

-Steve 




More information about the Digitalmars-d-learn mailing list