2015-08-02 22 views
5

yılında Paketten Çıkarma Parametre Paketi. f, dönüş değerini eşzamansız olarak hesaplar ve geleceği döndürür. Şimdi f birkaç dönüş değerlerine dayalı, ben g aramak istiyorum ama f değerleri hesaplamaları paralel gerçekleşmesi emin olmak istiyorum.Ben iki işlevi <code>f</code> ve <code>g</code> sahip 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 
} 

nasıl variadic şablonun call_wrapper fonksiyonun T gelen türlerini açabilirsiniz:

Aşağıdaki kodu düşünün?

+1

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...>{}); } 
'std :: tuple' göz at. Variadic paket nesnelerini saklamak için mükemmeldir. – Quentin

cevap

5

[Edit2: Sanırım soruyu yanlış anladım, subzero'nun std::future s dönmek istediğini unuttum ve tek sorunun parametre paketi sözdizimi olduğunu düşündüm. Umarım, benim ilk düzenleme gibi bir yardımcı işlevini kullanarak] olsa

çalışması gerekir Sadece yapabilirsiniz:

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

i ne yapmak istediğini yanlış sürece.

Edit1: Başka bir şey yapmak istiyorsanız, böyle iki arama fonksiyonu bölebilirsiniz:

: Burada
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

Bu işe yaramalıdır, çünkü doğru değeri hesaplayacaktır, ancak 'f' hesaplamaları paralel olarak gerçekleşmeyecektir. İlk argüman hesaplanacak, sonra ikinci ve daha sonra hesaplanacak. – subzero

+0

... bir işlevde 'future's yapma ve başka – subzero

+0

Ah' almak() 's çağırarak işe yarayabilir, ben "paralel" üzgünüm, belki ikinci form sonra çalışacak unuttu, ama ben Emin değilim, sorunuzun bir kısmını yanlış anlamış olduğumu belirteceğim. – Caninonos

İlgili konular