2014-12-17 10 views
12

Ho riprodotto con un semplice codice sotto qualcosa che mi manca.
La classe B possiede la classe A come membro e utilizza lo stesso nome tipografico.
Desidero evitare la replica di questi modelli in modo che nel main() possa chiamare qualcosa come B b (a, 3.0) che riutilizzerebbe il modello da A. È possibile?Riutilizzare i parametri del modello attraverso diverse classi

#include <iostream> 
#include <vector> 

template<int N, typename T=double> 
struct A 
{ 
    A(T val) : vecA(N, val) {} 
    void print() { for (auto i : vecA) std::cout << i << ";"; } 
    std::vector<T> vecA; 
}; 

template<int N, typename T> 
struct B 
{ 
    B(const A<N,T> & in, T scal) : a(in), scalB(scal) {} 
    void print() { a.print(); std::cout << " | " << scalB << std::endl; } 
    A<N,T> a; 
    T scalB; 
}; 


int main() 
{ 
    A<5,float> a(2.0); 
    B<5,float> b(a, 3.0); // This is redundancy. Can I do something like B b(a,3.0) ? 
    b.print(); 
} 
+1

Se siete curiosi sul perché non è consentito: http://stackoverflow.com/questions/984394/why-not -infer-template-parameter-from-constructor – DarioP

risposta

16

parametri dei modelli possono essere dedotte dai tipi di argomenti di una funzione di modello, ma non di argomenti del costruttore di un modello di classe. Così si potrebbe fare ciò che la libreria standard fa (per esempio con make_pair) e scrivere una funzione di dedurre per voi:

template <int N, typename T> 
B<N,T> make_b(const A<N,T> & in, T scal) { 
    return B<N,T>(in, scal); 
} 

auto b = make_b(a, 3.0f); 

Si noti che questo richiede un argomento float 3.0f, in base al tipo di a. Si potrebbe parametrizzare quel tipo a parte, se si desidera consentire conversioni sul secondo argomento:

template <int N, typename T, typename T2> 
B<N,T> make_b(const A<N,T> & in, T2 scal) { 
    return B<N,T>(in, scal); 
} 

auto b = make_b(a, 3.0); 
+0

Grazie per questa risposta molto chiara! – coincoin

2

Non in questo mondo.

auto b = make_b(a, 3.0); 

(Attuazione make_b lasciato come esercizio, vedi std::make_pair).

+5

'make_pair' o' make_tuple' sarebbero esempi migliori. 'make_shared' e' make_unique' non ne deducono i tipi di ritorno. –

8

No, poiché si crea l'oggetto di tipo B<int, T>. Con C++ 11 è possibile utilizzare auto e scrivere semplice funzione di creazione

template<int N, typename T> 
B<N, T> create(const A<N, T>& in, T scal) 
{ 
    return B<N, T>(in, scal); 
} 

// in main 
auto b = create(a, 3.0f); 
Problemi correlati