C++ 将Boost适配器与std::bind表达式一起使用
我有以下代码:C++ 将Boost适配器与std::bind表达式一起使用,c++,c++11,boost,boost-range,C++,C++11,Boost,Boost Range,我有以下代码: #include <boost/range/adaptor/transformed.hpp> #include <boost/range/algorithm.hpp> #include <iostream> #include <functional> #include <memory> struct A { A() = default; A(const A&) = delete; A&
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>
#include <functional>
#include <memory>
struct A {
A() = default;
A(const A&) = delete;
A& operator=(const A&) = delete;
};
struct B {
B() = default;
B(const B&) = delete;
B& operator=(const B&) = delete;
int foo(const A&, int b) {
return -b;
}
};
int main() {
A a;
auto b = std::make_shared<B>();
std::vector<int> values{1, 2, 3, 2};
using std::placeholders::_1;
auto fun = std::bind(&B::foo, b.get(), std::ref(a), _1);
int min = *boost::min_element(values | boost::adaptors::transformed(fun));
std::cout << min << std::endl;
}
#包括
#包括
#包括
#包括
#包括
结构A{
A()=默认值;
A(常数A&)=删除;
A&运算符=(常量A&)=删除;
};
结构B{
B()=默认值;
B(常数B&)=删除;
B&运算符=(常量B&)=删除;
int foo(常量A和int b){
返回-b;
}
};
int main(){
A A;
自动b=std::使_共享();
std::向量值{1,2,3,2};
使用std::占位符::1;
auto-fun=std::bind(&B::foo,B.get(),std::ref(a),_1);
int min=*boost::min_元素(值| boost::adapters::transformed(fun));
std::cout问题是:
该标准不要求std::bind
的返回值是可复制分配的;只要求可移动可构造(如果所有绑定对象也可复制构造,则可复制可构造)。对于lambda,需要删除其复制分配运算符
范围适配器实际上使用了transform\u迭代器
,因此函数对象存储在迭代器中
迭代器必须是可复制分配的,min_元素
尝试这样做,程序就会崩溃
随着C++11中lambdas的大量出现,我认为这是boost库的一个问题,它的设计并没有考虑可复制的可构造函数对象,也没有考虑可复制的可分配函数对象
实际上,我建议将结果函数对象包装在引用\u包装中
:
int min = *boost::min_element(values | boost::adaptors::transformed(std::ref(fun)));
这也节省了每次复制迭代器时制作函子额外副本的成本
在您列出的两个选项中,boost::bind
应该更有效,因为它不必执行类型擦除。问题在于:
该标准不要求std::bind
的返回值是可复制分配的;只要求可移动可构造(如果所有绑定对象也可复制构造,则可复制可构造)。对于lambda,需要删除其复制分配运算符
范围适配器实际上使用了transform\u迭代器
,因此函数对象存储在迭代器中
迭代器必须是可复制分配的,min_元素
尝试这样做,程序就会崩溃
随着C++11中lambdas的大量出现,我认为这是boost库的一个问题,它的设计并没有考虑可复制的可构造函数对象,也没有考虑可复制的可分配函数对象
实际上,我建议将结果函数对象包装在引用\u包装中
:
int min = *boost::min_element(values | boost::adaptors::transformed(std::ref(fun)));
这也节省了每次复制迭代器时制作函子额外副本的成本
在您列出的两个选项中,boost::bind
应该更有效,因为它不需要进行类型擦除。2)boost::bind
比std::function
2)更有效。boost::bind
比std::function
更有效。谢谢,包装函数的参考资料。实际上,我发现在这种情况下,最好包装一个lambda。谢谢,包装函数的参考文件是有效的。实际上,我发现在这种情况下包装一个lambda更好。