2013-05-28 10 views
9

Napisałem ten kod i obecnie można zaakceptować jedno wywołanie zwrotne void i przekazać mu jedną wartość. Czy jest jakiś sposób, aby umożliwić użytkownikowi ustawianie wielu argumentów? Być może coś w rodzaju Callback Caller; zamiast Callback bez definiowania wielu nazw typów? Czy mogę w jakiś sposób dopasować to wszystko do jednej nazwy?Czy mogę mimo wszystko zrobić szablon, aby zaakceptować wiele wartości?

Na przykład, tutaj jest moja klasa

template <typename T> 
class Callback 
{ 
private: 
    std::vector<std::function <void (T)>> func; 
public: 
    virtual void operator += (std::function<void (T)> _func) 
    { 
     func.push_back(_func); 
    } 

}; 

używam go tak:

Callback<int> Test; 

I to działa dobrze, jeśli chcę przejść tylko jeden argument do mojej funkcji. Czy jest jednak możliwe, aby użytkownik mógł zdefiniować wiele wartości, nie mając więcej niż jednego typu nazwy?

tj.

Callback< <(int, int, int)> > Test; 

Coś podobnego do tego?

+1

Warto wspomnieć, że można użyć 'emplace_back' zamiast' push_back' w C++ 11, aby zbudować go w miejscu. – chris

Odpowiedz

13

w C++ 11, używają zmiennej liczbie argumentów szablony:

template <typename... Ts> 
//    ^^^^^^ Parameter pack 
class Callback 
{ 
private: 
    std::vector<std::function <void (Ts...)>> func; 
//         ^^^^^ 
//         Parameter pack expansion 
public: 
    virtual void operator += (std::function<void (Ts...)> _func) 
//            ^^^^^ 
//        Parameter pack expansion    
    { 
     func.push_back(_func); 
    } 
}; 

Teraz można zainicjować klasę w ten sposób:

Callback<int, int, int> 
Callback<double, std::string> 
Callback<bool> 
Callback<> 
... 
+0

Dzięki, działa idealnie. Przeczytam o parametrach pakowania, aby dowiedzieć się więcej. – Jason

+0

@Jason: OK, cieszę się, że mogłem pomóc. Jeśli to odpowie na twoje pytanie, rozważ oznaczenie odpowiedzi jako zaakceptowane, gdy system pozwoli ci :) –

1

bez C++ 0x można użyć boost::mpl::set przekazać zestaw typów. Jeśli potrzebujesz kolejności argumentów, użyj boost::mpl::vector.

Aby uzyskać więcej informacji, zobacz numer http://www.boost.org.

Powiązane problemy