2014-06-12 1 views
4

Comment passer des informations de type dans un thread, afin que les objets des types corrects puissent être créés dans le thread en utilisant les informations transmises? Quelque chose comme ceci:Comment passer des informations de type à travers des modèles pour instancier des objets dans D

struct Test // or class Test 
{ 
    int x, y, z; 
} 

void testInThread(F, T ...)(T args) 
{ 
    auto obj = F(args); 
    // Do stuf with obj in the new thread 
} 

auto tid = std.concurrency.spawn!(testInThread, Test, 1, 2, 3); 

// Threads and stuff... 

Ceci ne compile pas, mais je suis sûr que quelque chose comme ceci devrait être possible. Je pense qu'il y a juste quelque chose que je ne comprends pas sur les paramètres du template.

Répondre

4

Cette ligne ici compilation:

auto tid = std.concurrency.spawn(&testInThread!(Test, int, int, int), 1, 2, 3); 

Je ne sais pas si vous pouvez le faire plus joli avec déduction implicite de ces ints ou non cependant. Mais la raison pour laquelle cela se compile est que spawn attend une fonction. testInThread est un modèle qui génère une fonction. Si vous lui passez la liste des arguments de temps de compilation là-bas sans liste d'exécution, vous pouvez obtenir l'adresse de la fonction ... ce qui est assez bon pour spawn.

4

spawn accepte un pointeur vers une fonction. Ce que vous essayez de lui transmettre est un modèle pour une fonction. Si vous voulez passer une fonction basé sur un modèle, cette fonction basé sur un modèle doit être entièrement instancié - dans ce cas, quelque chose comme

auto tid = std.concurrency.spawn(&testInThread!(Test, int ,int, int), 1, 2, 3); 

Mais comme modèles sont des constructions de compilation, il ne va pas travailler pour passer des arguments de modèle à travers les discussions et avoir un modèle instancié de l'autre côté. Tous les modèles sont beaucoup instanciés au moment de la compilation. Donc, si le problème est vraiment que vous voulez pouvoir passer une fonction de template à spawn et qu'elle soit appelée dans l'autre thread, alors l'exemple ci-dessus le fait, mais si vous voulez vraiment passer des arguments de template à travers les threads, alors vous n'avez pas de chance.

Vous voudrez peut-être lire le template chapter de online book on D de Ali Çehreli afin de mieux comprendre les modèles.

Questions connexes