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ď č. 1Nemyslí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
naa9
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.