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更好。