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



问题描述

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

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>()));中一样。我不知道怎么做。它不是编译的,我也无法真正解释错误。

如何为类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>(); });

最新更新