gpt4 book ai didi

c++ - 如何传递唯一指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:26:14 24 4
gpt4 key购买 nike

我有一个容器类,它有一个数据成员。

std::vector< std::unique_ptr<Sum_Function> > Functions;

这就是我为 vector 增加值(value)的方式。

MaxSize 是 Sum_Function 的子项。

void WavefrontRenderer::AddMaxSize()
{
Container cont;
std::unique_ptr<Sum_Function> ptrMaxSize = std::make_unique<SumMaxSize>();
cont.AddFunction(ptrMaxSize);
}

这是 Container 类中 Function 的定义。

void Container::AddFunction(std::unique_ptr<Sum_Function> &func)
{
std::unique_ptr< Sum_Function > function(std::move(func));
this->Functions.push_back(function);
}

这是将 Unique 指针添加到 vector 的正确方法吗?

最佳答案

要将现有的 Sum_Function 子类对象指针移动到 Functions 中,您可以这样做:

void AddFunction(std::unique_ptr<Sum_Function>& func) {
Functions.emplace_back(std::move(func));
}
...
Container c;
auto f = std::make_unique<SumMaxSize>();
c.AddFunction(f);

... 或者像这样,它要求参数是一个右值引用,这反过来又使指针窃取更加明显:

void AddFunction(std::unique_ptr<Sum_Function>&& func) {
Functions.emplace_back(std::move(func));
}
...
Container c;
auto f = std::make_unique<SumMaxSize>();
// c.AddFunction(f); // Error, f is an lvalue
c.AddFunction(std::move(f)); // OK, xvalue
c.AddFunction(std::make_unique<SumMaxSize>()); // OK, prvalue

您还可以在 Container 中提供一个方便的成员函数,以便直接在 vector 中创建它而无需中间步骤:

template<typename T, class... Args>
void emplace_back(Args&&... args) {
Functions.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
}

而不是先执行 make_unique 然后调用 AddFunction,只需:

Container c;
c.emplace_back<SumMaxSize>();

上面 emplace_back 函数模板中的完美转发也将使就地构造适用于具有带参数构造函数的子类:

struct BiasedSumFunc : Sum_Function {
BiasedSumFunc(int bias) : bias_(bias) {}
private:
int bias_;
};
...
Container c;
c.emplace_back<BiasedSumFunc>( -5 );

关于c++ - 如何传递唯一指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57702856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com