微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在可变参数模板参数中绑定不可移动对象的引用?

如何解决如何在可变参数模板参数中绑定不可移动对象的引用?

在以下最小示例中:

#include <iostream>
#include <functional>

class Non_movable{
public:
  Non_movable(void){ }
  Non_movable(const Non_movable& other) = delete;/* copy constructor */
  Non_movable(Non_movable&& other) = delete; /* Move constructor */
  Non_movable& operator=(const Non_movable& other) = delete; /* copy assignment */
  Non_movable& operator=(Non_movable&& other) = delete; /* Move assignment */
};

template<typename ...T>
std::function<void(int)> make_bound(T... args,std::function<void(T...,int)> fun){
  return std::bind(fun,args...,std::placeholders::_1);
}

int main(int argc,char** agrs){
  Non_movable no_move;
  make_bound<Non_movable&>(no_move,[](Non_movable&,int num){
    std::cout << num << std::endl;
  })(6);
  return 0;
}

在--std=c++14 上编译时会出现一大堆编译错误,这是可以理解的,因为可变参数模板中的每个参数都应该使用 std::ref 关键字来使其可编译。

有趣的是,如果五人组成为认设置,而不是被删除,编译通过,并且函数调用的行为就像使用左值 Non_movable 调用模板一样,这是为什么?

有没有办法用可变参数模板编译这个?

解决方法

在参数包扩展中,您可以编写任何模式,包括至少一个参数包,参见 https://en.cppreference.com/w/cpp/language/parameter_pack。 这意味着在你的 make_bound 函数中你可以只写

return std::bind(fun,std::ref(args)...,std::placeholders::_1);

请在此处找到您改编的最小示例:https://onlinegdb.com/XhTBHpW9X

除此之外,您的 no_move 对象是一个左值,因此它会作为左值传递给 make_bound,无论复制/移动构造函数和赋值运算符是默认的还是删除的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。