如何将 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 和 A
和 B
。 B
具有以下构造函数:
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>(); });
问题描述
我们有 2
class 和 A
和 B
。 B
具有以下构造函数:
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>(); });