2013-03-04 13 views
5

Mam funkcji szablonuC++ jak zdefiniować funkcję, nie znając dokładnych parametrów

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(...); 
} 

Jak mogę rozwiązać ten problem? Jakoś pamiętam funkcje z wejściem jak (..., ...)?

+5

Słowa kluczowe do wyszukania: varargs, lista argumentów o zmiennej długości, szablony variadic. (Jednak fragment kodu wydaje się dziwny, nie ma tam nic, co można by przekazać konstruktorowi T). – us2012

+2

Jeśli nie znasz liczby parametrów, skąd wiadomo, jakie wartości należy przekazać? –

+0

pomocą tego łącza http://stackoverflow.com/questions/3307939/c-template-function-with-unknown-number-of-arguments –

Odpowiedz

1

Oto pracy C++ 11 dla was przykładem na podstawie 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); 
} 

Nadzieję, że to pomaga. Powodzenia!

+2

Shoo, shoo, złe posiadanie surowych wskazówek, shoo! – Xeo

+0

@Xeo: A teraz? RAII do końca. –

+0

Shoo, shoo, bad no-'make_unique', shoo! ... Żartuję. ;) – Xeo

6

Można użyć zmiennej liczbie argumentów szablony:

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 ma tutaj bardziej szczegółowo, w jaki sposób rozpakować argumenty z zmiennej liczbie argumentów szablonu. Ten question here może również dostarczyć więcej informacji

+2

Masz na myśli 'szablon '. Twoje zmiany nie mają żadnego sensu :-). Musisz 'Args' przekazać do funkcji, a nie' T'. Używaj również 'std :: forward' podczas przekazywania argumentów do konstruktora. – Praetorian

+0

Zbyt leniwy, aby podać przykład pracy? :) –

Powiązane problemy