2013-03-04 22 views
5

Ho una funzione templateC++ come definire una funzione senza conoscere i parametri esatti

template <class T> 
void foo() { 
    // Within this function I need to create a new T 
    // with some parameters. Now the problem is I don't 
    // know the number of parameters needed for T (could be 
    // 2 or 3 or 4) 
    auto p = new T(...); 
} 

Come posso risolvere questo? In qualche modo ricordo di aver visto funzioni con l'input come (..., ...)?

+5

Parole chiave da cercare: vararg, lista di argomenti a lunghezza variabile, modelli variadici. (Tuttavia, lo snippet di codice sembra strano, non c'è nulla che possa essere passato al costruttore di T.) – us2012

+2

Se non conosci il numero di parametri, come fai a sapere quali valori passare? –

+0

Utilizzare questo link http://stackoverflow.com/questions/3307939/c-template-function-with-unknown-number-of-arguments –

risposta

1

Qui è il lavoro 11 C++ esempio per voi sulla base di una variadic template:

#include <utility> // for std::forward. 
#include <iostream> // Only for std::cout and std::endl. 

template <typename T, typename ...Args> 
void foo(Args && ...args) 
{ 
    std::unique_ptr<T> p(new T(std::forward<Args>(args)...)); 
} 

class Bar { 
    public: 
    Bar(int x, double y) { 
     std::cout << "Bar::Bar(" << x << ", " << y << ")" << std::endl; 
    } 
}; 

int main() 
{ 
    foo<Bar>(12345, .12345); 
} 

Speranza che aiuta. In bocca al lupo!

+2

Shoo, shoo, cattivi puntatori grezzi, shoo! – Xeo

+0

@Xeo: che ne dici adesso? RAII fino in fondo. –

+0

Shoo, shoo, bad no-'make_unique', shoo! ... Stavo solo scherzando. ;) – Xeo

6

È possibile utilizzare i modelli variadic:

template <class T, class... Args> 
void foo(Args&&... args){ 

    //unpack the args 
    T(std::forward<Args>(args)...); 

    sizeof...(Args); //returns number of args in your argument pack. 
} 

This question qui ha più dettagli su come scompattare gli argomenti da un modello variadic. Questo question here può anche fornire ulteriori informazioni

+2

Vuoi dire 'template '. Le tue modifiche non hanno alcun senso :-). Hai bisogno di 'Args' per essere passato alla funzione, non' T'. Inoltre, usa 'std :: forward' quando passi gli argomenti al costruttore. – Praetorian

+0

Troppo pigro per fornire un esempio di lavoro? :) –

Problemi correlati