2017-09-20 10 views
2

Si je fais quelque chose commeComment appeler un constructeur à partir d'un modèle mixin mixedin

mixin template T() { 
    float y; 
    this(float y_){ 
    y = y_; 
    } 
} 
class C { 
    mixin T!() t; 
    int x; 
    this(int x_, float y_){ 
    x = x_; 
    this(y_); 
    } 
} 
// 
C c = new C(5, 7.0f); 

Cela donne l'erreur constructor C.this (int x_, float y_) is not callable using argument types (float). Sur la ligne qui contient this(y_); dans le constructeur de C, ce qui semble impliquer que C ne peut pas voir le constructeur importé de T. Bien, il devrait. Il est évident que t.this(...) et T!().this(...) ne fonctionnent pas.

La solution la plus évidente que je peux penser est comme (proxy):

template T(...) { 
    void constructor(...){...} 
    this(Args...)(Args args){ constructor(args); } 
} 
... 
class C { 
    mixin T!() t; 
    this(...){ 
    t.constructor(...); 
    } 
} 

Mais qui aspire parce qu'il met plus de frais généraux de connaissances sur T (en utilisant le constructeur exige de faire quelque chose de spécial)

Existe-t-il un moyen d'appeler le constructeur de t de manière non-bizarre (et non-spécifique)? Aussi, est-ce un bug? Si non, pourquoi cela fonctionne-t-il de cette façon?

Répondre

3

Le problème provient du fait que les choses mélangées dans un agrégat via des modèles mixin are not inserted into the aggregate's overload set.

Pour les méthodes normales, la façon de se déplacer qui est d'utiliser un alias dans le champ d'application introduit par le modèle mixin comme ceci:

mixin template T() 
{ 
    void foo() 
    { 
    } 
} 

class C 
{ 
    mixin T!() t; 
    alias foo = t.foo; 

    void foo(int _) 
    { 
     foo(); 
    } 
} 

Cependant, pour les constructeurs, l'analogue ne fonctionne pas et it's a reported bug:

alias this = t.this; // Won't compile 
    alias __ctor = t.__ctor // Using the hidden __ctor name won't compile, either 

Si vous n'avez pas besoin d'appeler le mélange dans le constructeur de l'extérieur, vous pouvez l'appeler via le nom builtin:

mixin template T() 
{ 
    float y; 
    this(float y_) 
    { 
     y = y_; 
    } 
} 
class C 
{ 
    mixin T!() t; 
    int x; 
    this(int x_, float y_) 
    { 
     x = x_; 
     t.__ctor(y_); // This 
    } 
}