2014-09-05 67 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

相关问题