2012-11-27 5 views
6

Teraz mam następujący zastosować dwie funkcje do wartości i zwracają 2-wartość krotki:Zastosuj krotki funkcji do wartości i powrócić krotki

template<typename F1, typename F2> 
class Apply2 
{ 
public: 
    using return_type = std::tuple<typename F1::return_type, typename F2::return_type>; 

    Apply2(const F1& f1, const F2& f2) : f1_(f1), f2_(f2) {} 

    template<typename T> return_type operator()(const T& t) const 
    { 
     return std::make_tuple(f1_(t), f2_(t)); 
    } 

protected: 
    const F1& f1_; 
    const F2& f2_; 
}; 

chciałem generalizować to N funkcje:

template<typename ...F> 
class ApplyN 
{ 
public: 
    using return_type = std::tuple<typename F::return_type...>; 

    ApplyN(const std::tuple<F...>& fs) : functions_(fs) {} 

    template<typename T> return_type operator()(const T& t) const 
    { 
     return ???; 
    } 

protected: 
    std::tuple<F...> functions_; 
}; 

Wiem, że prawdopodobnie muszę użyć rekursji szablonów, ale nie mogę owinąć się wokół niego. Jakieś pomysły?

+3

Kolejna praca dla Supermana! Erm, mam na myśli, dla [indeksów] (http://stackoverflow.com/a/10930078/46642). –

Odpowiedz

4

Zajęło mi to trochę czasu, ale tutaj jest to (za pomocą indices):

template<typename ...F> 
class ApplyN 
{ 
public: 
    using return_type = std::tuple<typename F::return_type...>; 

    ApplyN(const F&... fs) : functions_{fs...} {} 

    template<typename T> return_type operator()(const T& t) const 
    { 
     return with_indices(t, IndicesFor<std::tuple<F...> >{}); 
    } 

protected: 
    std::tuple<F...> functions_; 

    template <typename T, std::size_t... Indices> 
    return_type with_indices(const T& t, indices<Indices...>) const 
    { 
     return return_type{std::get<Indices>(functions_)(t)...}; 
    } 
}; 

Ktoś miał (niepełna) Odpowiedź wcześniej, ale on/ona skasowana go - to był mój punkt wyjścia. W każdym razie, dziękuję nieznajomemu! Dziękuję R. Martinho Fernandes też!

+1

Dobra robota! Nie pisałem wcześniej odpowiedzi, ponieważ byłem w pracy, więc zostawiłem komentarz, aby ktoś mógł odebrać stamtąd. Cieszę się, że to wystarczyło, abyś * ty * dostała rozwiązanie. –