2010-10-31 3 views
1

Dans le code:Comment passer des arguments au constructeur d'une politique?

template<class T> 
struct FactorPolicy 
{ 
    T factor_; 
    FactorPolicy(T value):factor_(value) 
    { 
    } 
}; 

template<class T, template<class> class Policy = FactorPolicy> 
struct Map 
{ 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
     Map<int,FactorPolicy> m;//in here I would like to pass a double value to a 
//FactorPolicy but I do not know how. 
     return 0; 
    } 

Edité [Mark H]

template<class T, template<class> class Policy = FactorPolicy> 
struct Map : Policy<double> 
{ 
    Map(double value):Policy<double>(value) 
    { 
    } 
}; 
+0

Pourquoi le voulez-vous? –

+0

@Alexey si vous regardez il y a un arg de cteur du FactorPolicy être passé et je voudrais pouvoir transmettre cette valeur en déclarant la variable carte. Quelque chose comme ceci: Carte

Répondre

0

Une façon est de fournir des modèles de fonction des membres qui prennent un arg modèle à utiliser avec la politique. Par exemple:

template<class T, template<class> class Policy = FactorPolicy> 
struct Map 
{ 
    template <typename V> 
    void foo(const Policy<V> &p) 
    { 
    } 
}; 

Puis, dans le principal:

Map<int,FactorPolicy> m; 

m.foo(FactorPolicy<double>(5.0)); 

Une autre possibilité est de le spécifier dans le cadre du modèle Carte instanciation, en ajoutant un troisième modèle arg à la carte:

template<class T, template<class> class Policy = FactorPolicy, 
     class V = double> 
struct Map 
{ 
    void foo(const V &value) 
    { 
    Policy<V> policy(value); 
    } 
}; 

Ensuite:

Map<int,FactorPolicy,double> m; 

m.foo(5.0); 
+0

non, je ne @ Michael pas, il est une classe de modèle de modèle –

+0

OK, donc fait ce que je spécifié pour vous _tmain fonction élaborer? Parce que la ligne du bas est que vous ne pouvez pas définir une variable sans spécifier tous les arguments de modèle (réels). –

+0

@Michael à votre mise à jour, je ne suis pas sûr à 100% mais si je déclare un modèle de template, je n'ai pas à fournir de params dans le template decl. Mais comme je l'ai dit, je ne suis pas sûr à 100%. –

0

Si vous deviez passer un doublon, il faudrait que l'argument type de FactorPolicy soit double dans Map, sauf si vous faites en sorte que le constructeur FactorPolicy accepte un double. Je ne pense pas que ce soit ce que tu veux. Vous devez informer Map que la politique a besoin d'un double, donc ajoutez d'abord cet argument de type. Deuxièmement, je pense que vous devrez transférer la double valeur réelle du constructeur Map.

template<class T, typename U, template<class> class Policy = FactorPolicy > 
struct Map { 
    Map(U val) { 
     policy_ = new Policy<U>(val); 
    } 

    Policy<U>* policy_; 
}; 

int main() 
{ 
    Map<int, double, FactorPolicy> m(5.63); 
    return 0; 
} 
+0

@Mark Si je veux passer la valeur du facteur au ctor je le ferais encore plus simple - vous n'avez pas besoin de spécifier le type U. –

+0

Pour ce que vous réclamez, vous devez définir comme 'template >'. Sinon comment Map va savoir que FactorPolicy a besoin d'un double? Il ne peut pas simplement en déduire que du type de l'argument, vous devez indiquer de manière explicite le type quelque part. –

+0

@Mark donnez-moi sec –

Questions connexes