/ Ako načarovať variadic šablónu verzie ctor boost :: thread? - c ++, zvýšenie

Ako vyvolať verziu variadic šablóny ctor boost :: thread? - c ++, zvýšenie

Nižšie sú moje kódy, ktoré sa nepodarilo prejsť kompiláciou príkazu g++ -std=c++11 a.cpp -Wall -lboost_thread -lboost_system, ak je množstvo argumentov spätného volania väčšie ako 9, v tomto príklade to je kedy TRY_VARIADIC je definovaný.

#include <iostream>
#include <boost/thread.hpp>

void foo(void) {}

template <typename T, typename... argTs>
void foo(T a0, argTs ...args)
{
std::cout << a0 << std::endl;
foo(args...);
}

int main(int argc, char *argv[])
{
#if TRY_VARIADIC
boost::thread t(foo<int, int, int, int, int, int, int, int, int, int>, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
#else
boost::thread t(foo<int, int, int, int, int, int, int, int, int>, 1, 2, 3, 4, 5, 6, 7, 8, 9);
#endif
t.join();
return 0;
}

Variadická verzia ctor boost::thread umožňuje viac ako 9 argumentov, ale ja neviem, ako urobiť kompilátor, aby si to vybral.Akékoľvek návrhy, rady a príklady sú veľmi cenené.Vďaka. :-)

odpovede:

0 pre odpoveď č. 1

Nemyslím si, že je to možné. Podľa závitu docs:

Konštruktor vlákna s argumentmi

 template <class F,class A1,class A2,...>
thread(F f,A1 a1,A2 a2,...);

...

Poznámka:

V súčasnosti je až deväť ďalších argumentov a1 na a9 možno okrem funkcie tiež špecifikovať f.

Môžete len zabaliť "em všetko v a std::tuple, Alebo, pretože ste na kompiláte, ktorý podporuje variadic šablóny, môžete len použiť std::thread.


0 pre odpoveď č. 2
boost::thread( [=]{ f(1,2,3,4,5,6,7,8,9,10); } );

schopnosť pre boost::thread a std::thread aby som sa s argumentmi dovolával, je roztomilý, ale lambdas väčšinou zastaráva. Ak máte iba údaje o pohybe, potrebujete C ++ 14, alebo to preniesť explicitne, ale to je prípad rohu.