Whitch can replace std::bind/boost::bind ?
Dsby via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Apr 22 02:35:23 PDT 2016
On Friday, 18 March 2016 at 17:24:27 UTC, Ali Çehreli wrote:
> On 03/18/2016 03:50 AM, Dsby wrote:
>>
>> foreach (i ; 0..4) {
>> auto th = new Thread(delegate(){listRun(i);});//this is
>> erro
>> _thread[i]= th;
>> th.start();
>> }
>>
>> void listRun(int i)
>> {
>> writeln("i = ", i); // the value is not(0,1,2,3), it all
>> is 2.
>> }
>>
>>
>> I want to know how to use it like std::bind.
>>
>>
>
> A workaround is an intermediate function that returns the
> delegate:
>
> import std.stdio;
> import core.thread;
>
> void listRun(int i)
> {
> writeln("i = ", i); // the value is not(0,1,2,3), it all
> is 2.
> }
>
> auto makeClosure(int i) {
> return delegate(){listRun(i);};
> }
>
> void main() {
> Thread[4] _thread;
>
> foreach (i ; 0..4) {
> auto th = new Thread(makeClosure(i));
> _thread[i]= th;
> th.start();
> }
> }
>
> Prints different values:
>
> i = 1
> i = 0
> i = 2
> i = 3
>
> Ali
Thanks for your mind.
i write the bind function:
import std.stdio;
import core.thread;
import std.functional;
class AA
{
void show(int i)
{
writeln("i = ", i); // the value is not(0,1,2,3), it all
is 2.
}
}
void listRun(int i)
{
writeln("i = ", i);
}
void main() {
Thread[4] _thread;
Thread[4] _thread2;
AA a = new AA();
foreach (i ; 0..4) {
auto th = new Thread(bindDg(&a.show,i));
_thread[i]= th;
auto th2 = new Thread(bindFun!listRun(i + 10));
_thread2[i]= th2;
}
foreach(i;0..4)
{
_thread[i].start();
}
foreach(i;0..4)
{
_thread2[i].start();
}
}
auto bindDg(T, Args...)(T fun,Args args) if (is(T == delegate) ||
is(T == function))
{
return delegate(){return fun(forward!args);};
}
auto bindFun(alias Fun,Args...)(Args args) {
return delegate(){return Fun(forward!args);};
}
my value is :
i = 2
i = 0
i = 3
i = 11
i = 13
i = 10
i = 12
i = 1
More information about the Digitalmars-d-learn
mailing list