www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Function Pointers with Type T

reply "amparacha" <paracham mcmaster.ca> writes:
Can anyone looks at the following code to fix it.I am having
error when using pointers to functions with argument of type
T.This is a small portion of a program doing a generic quick sort
by passing a comparison function as an argument.

import std.stdio;


int main(){

return 0;
}

bool comp(T)(T left,T right){
//some comparison criteria
return false;
}


void sort(T)(T[]list,int left,int right)
{
int spiltPoint;
bool function(T)(T val1,T val2) ptr=&comp;
spiltPoint=partition(list,ptr,left,right);	
}

int partition(T)(T[]list,bool function(T)(T val1,T val2)ptr,int
left,int right){

return 2;

}
Sep 15 2014
next sibling parent reply "Adam D. Ruppe" <destructionator gmail.com> writes:
You can get the code to compile with two changes:

bool function(T)(T val1,T val2) ptr=&comp;

should be:

bool function(T val1,T val2) ptr=&comp!T;



The function pointer itself isn't a template, so it doesn't need 
the (T) parameter. Instead, since it is inside a template, you 
can just use the T from the outside directly.

Moreover, comp has compile time arguments, so you can't take the 
address of it without forwarding the arguments. So instead of 
&comp, you use &comp!T - passing the T from the outside to the 
comparison function too.

and also

int partition(T)(T[]list,bool function(T)(T val1,T val2)ptr,int

should be:

int partition(T)(T[]list,bool function(T val1,T val2)ptr,int


Again because the pointer isn't a new template, it should just 
use the type T from the outer argument list.
Sep 15 2014
next sibling parent reply "evilrat" <evilrat666 gmail.com> writes:
On Tuesday, 16 September 2014 at 01:16:14 UTC, Adam D. Ruppe 
wrote:
 bool function(T val1,T val2) ptr=&comp!T;


 Moreover, comp has compile time arguments, so you can't take 
 the address of it without forwarding the arguments. So instead 
 of &comp, you use &comp!T - passing the T from the outside to 
 the comparison function too.
i wish i knew that back when i needed it, so i could avoid spaghetti mess and not abandon my code :(
Sep 16 2014
parent "amparacha" <paracham mcmaster.ca> writes:
Thanks its the right help at right time.
On Tuesday, 16 September 2014 at 09:13:38 UTC, evilrat wrote:
 On Tuesday, 16 September 2014 at 01:16:14 UTC, Adam D. Ruppe 
 wrote:
 bool function(T val1,T val2) ptr=&comp!T;


 Moreover, comp has compile time arguments, so you can't take 
 the address of it without forwarding the arguments. So instead 
 of &comp, you use &comp!T - passing the T from the outside to 
 the comparison function too.
i wish i knew that back when i needed it, so i could avoid spaghetti mess and not abandon my code :(
Sep 16 2014
prev sibling parent reply "amparacha" <paracham mcmaster.ca> writes:
Thanks Adam you saved me from alot.Just one more question how can
I compare two arguments of type T.
On Tuesday, 16 September 2014 at 01:16:14 UTC, Adam D. Ruppe
wrote:
 You can get the code to compile with two changes:

 bool function(T)(T val1,T val2) ptr=&comp;

 should be:

 bool function(T val1,T val2) ptr=&comp!T;



 The function pointer itself isn't a template, so it doesn't 
 need the (T) parameter. Instead, since it is inside a template, 
 you can just use the T from the outside directly.

 Moreover, comp has compile time arguments, so you can't take 
 the address of it without forwarding the arguments. So instead 
 of &comp, you use &comp!T - passing the T from the outside to 
 the comparison function too.

 and also

 int partition(T)(T[]list,bool function(T)(T val1,T val2)ptr,int

 should be:

 int partition(T)(T[]list,bool function(T val1,T val2)ptr,int


 Again because the pointer isn't a new template, it should just 
 use the type T from the outer argument list.
Sep 16 2014
parent "Adam D. Ruppe" <destructionator gmail.com> writes:
On Tuesday, 16 September 2014 at 17:32:02 UTC, amparacha wrote:
 Thanks Adam you saved me from alot.Just one more question how 
 can
 I compare two arguments of type T.
If you want to compare the values, just use them like regular variables. If you want to compare the types, use: static if(is(T == R)) { } or one of the other forms here http://dlang.org/expression.html#IsExpression For example: bool typesMatch(T, R)() { static if(is(T == R)) return true; return false; } writeln(typesMatch!(int, float)); // false writeln(typesMatch!(int, int)); // true
Sep 16 2014
prev sibling parent reply ketmar via Digitalmars-d-learn <digitalmars-d-learn puremagic.com> writes:
On Tue, 16 Sep 2014 01:09:27 +0000
amparacha via Digitalmars-d-learn <digitalmars-d-learn puremagic.com>
wrote:

first change:
  bool function(T)(T val1,T val2) ptr=3D&comp;
to
  auto ptr =3D &comp!T;

second change:
  int partition(T)(T[]list,bool function(T)(T val1,T val2)ptr,int left,int =
right)}
to
  int partition(T)(T[]list,bool function(T val1,T val2)ptr,int left,int rig=
ht){
Sep 15 2014
parent "amparacha" <paracham mcmaster.ca> writes:
Thankx
On Tuesday, 16 September 2014 at 01:21:57 UTC, ketmar via 
Digitalmars-d-learn wrote:
 On Tue, 16 Sep 2014 01:09:27 +0000
 amparacha via Digitalmars-d-learn 
 <digitalmars-d-learn puremagic.com>
 wrote:

 first change:
   bool function(T)(T val1,T val2) ptr=&comp;
 to
   auto ptr = &comp!T;

 second change:
   int partition(T)(T[]list,bool function(T)(T val1,T 
 val2)ptr,int left,int right)}
 to
   int partition(T)(T[]list,bool function(T val1,T val2)ptr,int 
 left,int right){
Sep 16 2014