2015-06-19 39 views
0

以下是我的代碼,如果回調參數的數量超過9,在本示例中爲TRY_VARIADIC,則無法通過命令g++ -std=c++11 a.cpp -Wall -lboost_thread -lboost_system的編譯。如何調用boost :: thread的ctor的可變模板版本?

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

boost::thread構造函數的可變參數版本允許超過900點的參數,但我不知道如何使編譯器選擇它。任何建議,提示,例子都非常感謝。謝謝。 :-)

+1

「如果你需要超過9個參數,你可能會錯過一些」 - 來源未知 – sehe

回答

0

我不認爲這是可能的。根據線程docs

Thread構造帶參數的

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

...

注意

目前多達九個額外參數 a1a9

能除了功能之外還需要指定n f

你可以把所有的東西都包裹在std::tuple。或者,由於您使用的是支持可變模板的編譯器,因此您可以使用std::thread

+0

如果boost 1.58.0被關注,在boost/thread/detail/thread.hpp中,有兩個未公開的可變參數模板。其中一個具有線程屬性作爲其第一個參數。所以有可能'線程t(attr,callback,arg0,arg1)'。這個variadic ctor模板實際上是我想要使用的,並且它具有與上例中提到的啓用/禁用它們的可用性相同的常量宏。 – Cody

+0

@Cody它不看我,就好像該功能已完成(heap_new模板仍然有限) – sehe

+0

@Cody爲什麼要使用它?它的隱藏和無證的事實表明,這可能不是一個好主意。 – Barry

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

與參數來調用的能力boost::threadstd::thread是可愛的,但大多是lambda表達式使其過時。如果你有移動數據,你確實需要C++ 14,或者明確地傳遞它,但這是一個極端的例子。

+0

謝謝,但我仍然想知道如何使用boost提供的variadic ctor模板,其定義位於boost/thread/detail/thread.hpp(377)中。順便說一下,在這種情況下,也可以使用funtor來傳遞變量作爲函子的參數。 – Cody