假设我有一个使用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...)); }
};
和派生类
struct my_task : task_impl<my_task>
{
/* implementation using functionality of task_impl<> */
my_task(container&c, int i);
};
然后想通过
使用可变参数模板成员container c( /* args for ctor */ );
my_task::spawn(c,0);
这里发生的是spawn()
创建容器的副本,而不是通过引用传递原始容器。有没有办法强制执行参考?
答案 0 :(得分:6)
你有两个选项,要么用reference_wrapper
包装参数,所以函数调用复制reference_wrapper
而不是它引用的对象,或者让你的可变参数函数使用完美转发,这样它就可以通过参考参数:
template<typename... Args>
static void spawn(Args&&... args)
{ library::spawn(new task(std::forward<Args>(args)...)); }
答案 1 :(得分:1)
您可以使用std::ref
来包装参数。
这实际上经常发生,例如在使用带参考参数的函数创建std::thread
时,或使用std::bind
时。