Wal*_*ter 3 c++ pass-by-reference variadic-templates c++11
假设,我有一个使用CRTP的基类并提供一个可变参数模板静态成员函数
template<typename derived_task>
struct task_impl : library::task
{
/* some useful functionality implemented using CRTP */
/// static method for spawning a task.
template<typename... Args>
static void spawn(Args... args)
{ library::spawn(new task(args...)); }
};
Run Code Online (Sandbox Code Playgroud)
和派生类
struct my_task : task_impl<my_task>
{
/* implementation using functionality of task_impl<> */
my_task(container&c, int i);
};
Run Code Online (Sandbox Code Playgroud)
然后想要使用variadic模板成员via
container c( /* args for ctor */ );
my_task::spawn(c,0);
Run Code Online (Sandbox Code Playgroud)
这里发生的是spawn()创建容器的副本而不是通过引用传递原始容器.有没有办法强制执行参考?
你有两个选项,要么用a包装参数,reference_wrapper所以函数调用复制它reference_wrapper不是它引用的对象,或者使你的可变参数函数使用完美转发,这样它就可以通过引用传递参数:
template<typename... Args>
static void spawn(Args&&... args)
{ library::spawn(new task(std::forward<Args>(args)...)); }
Run Code Online (Sandbox Code Playgroud)