2012-11-27 16 views
6

Ngay bây giờ, tôi đã phần sau đây để áp dụng hai chức năng đến một giá trị và trả về một tuple 2 giá trị:Áp dụng một tuple chức năng đến một giá trị và trả về một tuple

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_; 
}; 

tôi muốn khái quát này để N chức năng:

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_; 
}; 

Tôi biết tôi có thể cần phải sử dụng đệ quy mẫu bằng cách nào đó, nhưng tôi không thể quấn quanh đầu. Bất kỳ ý tưởng?

+3

Một công việc khác cho Superman! Erm, ý tôi là, đối với [chỉ số] (http://stackoverflow.com/a/10930078/46642). –

Trả lời

4

Nó đã cho tôi một thời gian, nhưng ở đây nó được (sử dụng 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)...}; 
    } 
}; 

Có người đã có một (không đầy đủ) câu trả lời trước đó, nhưng anh/cô ta xóa nó - đó là điểm khởi đầu của tôi. Dù sao, cảm ơn bạn lạ! Cảm ơn bạn R. Martinho Fernandes quá!

+1

Làm tốt lắm! Tôi đã không đăng câu trả lời trước đây vì tôi đang làm việc, vì vậy tôi đã để lại nhận xét để một người nào đó sẽ nhận từ đó. Tôi mừng là đủ để bạn * giải quyết. –