如何将 Unique_ptrs 与具有 std::function 作为构造函数中的参数的 class 对象一起使用

How can I use Unique_ptrs with an class object having std::function as argument in the constructor

问题描述

我们有 2 class 和 ABB 具有以下构造函数:

B(std::function<std::unique_ptr<A>()> a)

我正在尝试创建一个 unique_ptr std::unique_ptr<B> aPtr = std::unique_ptr<B>(new B(std::function<std::unique_ptr<A>())); 我不知道该怎么做。它没有编译,我无法真正解释错误。

如何为 class B 创建 unique_ptr?


// Online C++ compiler to run C++ program online
#include <iostream>
#include <memory>
#include <functional>

class A {
public:
    A(){}
};

class B 
{
public:

    B(std::function<std::unique_ptr<A>()> a):_a(std::move(a)) {}

private:
    std::function<std::unique_ptr<A>()> _a;
};

int main() {
    //std::unique_ptr<B> bPtr = std::unique_ptr<B>(new B(std::function<std::unique_ptr<A>()));

    return 0;
}
auto bPtr = std::unique_ptr<B>(new B( std::function< std::unique_ptr<A>() > () ));
//                                     need to close the template         ^
//                                     need to construct an instance of     ^^

使用 std::make_unique:

可以让同样的事情变得更简单
auto bPtr = std::make_unique<B>( std::function< std::unique_ptr<A>() >() );
//                                               still as above      ^^^

编辑:调整新题版本:

您还没有提供复制构造函数——因此您需要存储 lambda 而不是创建 B 实例:

auto l = []() { return std::make_unique<A>(); };
auto bPtr = std::unique_ptr<B>(new B(l));
// or:
auto ptr  = std::make_unique<B>(l);

请注意,这个新的编辑版本为 std::function 对象(lambda!)提供了一个工厂函数,而最初的变体构造了一个没有函数存储在内部的空函数,因此不可调用!

您可以通过传递 std::function(或可能转换为的值)来构建 B。

例如适当的 lambda:

B b{[]() { return std::make_unique<A>(); }};

如果你真的想要std::unique_ptr<B>,那就变成:

std::unique_ptr<B> b = std::make_unique<B>([]() { return std::make_unique<A>(); });