2015-08-02 2 views
5

У меня есть две функции: f и g. f рассчитывает возвращаемое значение асинхронно и возвращает будущее. Теперь, основываясь на нескольких возвращаемых значениях f, я хочу позвонить g, но я хочу убедиться, что вычисления значений f происходят параллельно.Распаковка пакетов параметров в C++

Рассмотрим следующий код:

template <typename T> 
std::future<T> f(T& t); 

template <typename... T> 
void g(T&&... t) 

template <typename... T> 
void call_wrapper(T&&... t) { 
    auto f1 = f(t1); // How do I set the values of f1... fn 
    auto f2 = f(t2); 
    ... 
    g(f1.get(), f2.get()....); // How do I call g 
} 

Как я могу распаковать типы из VARIADIC шаблона T функции call_wrapper?

+1

Посмотрите на 'std :: tuple'. Он идеально подходит для хранения объектов вариационного пакета. – Quentin

ответ

5

[Edit2: Я думаю, что неправильно понял вопрос, я забыл, что subzero хотел вернуть std::future и просто подумал, что единственной проблемой был синтаксис пакета параметров. Будем надеяться, что с помощью вспомогательной функции, как в моем первом редактировать должен работать, хотя]

Вы можете просто сделать:

template <typename... T> 
void call_wrapper(T&&... t) { 
    g(f(std::forward<T>(t)).get()...); 
} 

Если я не понял, что вы хотите сделать.

Edit1: если вы хотите сделать что-то другое, вы можете разделить функции в двух вызовах, например:

template<typename... T> 
void helper(T&&... t) { 
    // ... 
    g(std::forward<T>(t).get()...); 
} 

template <typename... T> 
void call_wrapper(T&&... t) { 
    helper(f(std::forward<T>(t))...); 
} 
+0

Это должно работать, так как в нем будет вычисляться правильное значение, но вычисления 'f' не будут происходить параллельно. Вычисляется первый аргумент, затем второй и т. Д. – subzero

+0

, который мог бы работать ... делая 'future' в одной функции и вызывая' get() 's в другом – subzero

+0

А, я забыл о« параллельно », извините, возможно, вторая форма будет работать тогда, но i Я не уверен, я отредактирую, чтобы заявить, что я неправильно понял часть вашего вопроса. – Caninonos

3

Вот быстрое решение хранения std::future сек в std::tuple:

template <class T, std::size_t... Idx> 
void callG(T &tuple, std::index_sequence<Idx...>) { 
    g(std::get<Idx>(tuple).get()...); 
} 

template <typename... T> 
void call_wrapper(T&&... t) { 
    auto results = std::make_tuple(f(std::forward<T>(t))...); 
    callG(results, std::index_sequence_for<T...>{}); 
} 

Live on Coliru

Смежные вопросы