2014-09-05 174 views
2

誰知道如何將參數從繼承類傳遞給基本類構造函數,它接受各種數量的參數?我的意思是......「線程」類有不同數目的參數初始化構造函數,它表示如下:C++將各種參數傳遞給父類構造函數(線程C++ 11)

template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); 

所以...我想創建一個相同的初始化構造函數和構造新的類繼承的類必須通過所有參數基本(線程)類,但不知道如何=)

例如(我想):

class my_thread : public std::thread { 
private: 
    ..... 
public: 
    my_thread(WHAT TO WRITE HERE?) : thread (AND HERE) {}; 
    ..... 
}; 

void my_func(int arg_1, char arg_2) { 
    ..... 
} 

int main() { 
    my_thread mt(my_func, 20, -6); 
    mt.join(); 
} 

任何解決方案?

回答

2
template <class Fn, class... Args, 
      class = typename std::enable_if< 
        !std::is_same<typename std::decay<Fn>::type, 
           my_thread>::value>::type> 
explicit my_thread (Fn&& fn, Args&&... args) 
     : thread(std::forward<Fn>(fn), std::forward<Args>(args)...) { } 

關於從標準庫類型繼承的常見警告適用。如果您通過my_threadenable_if會從超載分辨率中刪除此構造函數,本質上重複LWG 2097的分辨率。

+0

您還應該添加my_thread(my_thread&)= delete;以避免意外地將一個非const引用傳遞給my_thread給基類。 – Nevin 2014-09-06 00:54:24

+0

@Nevin所以基本上它與[LWG 2097](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2097)類似的關注點? – 2014-09-06 01:55:33

+1

@ T.C。基本上,是的。這是一個非常普遍的問題。非const的左值引用總是與模板化構造函數(因爲它不需要轉換)相比更好地匹配複製構造函數(這需要非const到const轉換),所以您總是必須小心一點模板構造函數的存在。 – Nevin 2014-09-06 08:01:06

相關問題