gpt4 book ai didi

c++ - 如何消耗元素的灵魂

转载 作者:行者123 更新时间:2023-12-05 01:56:30 26 4
gpt4 key购买 nike

我有一个没有默认构造函数的可移动类型,我想拿走它的内部数据并销毁它们。我的想法是将它 std::move 到一个临时对象,并让临时析构函数发生(以销毁内部数据),留下原来现在为空的对象。

我得到的最接近的方法是使用一个小的辅助模板,它的唯一目的是破坏它的参数(这就是为什么它按值传递,以及为什么函数体是空的。)(也许有更好的方法?)然后我调用 std::move 将原始对象的内部移动到一个临时对象,临时对象将被销毁,破坏原始内部,并使对象处于它所处的任何状态在将其内部移动到另一个对象之后。

template <typename T>
void reset(T t) {}
};

reset(std::move(somevar));

例如,如果我有一个非常长的字符串 vector ,并且我想“释放” vector 中间的一个字符串正在使用的内存。这不是完美的例子,因为字符串确实有一个无参数的构造函数,但我的类型没有。然而,这捕获了我尝试这样做的动机。

std::vector<std::string> vec; // suppose I have a populated vector of strings

// Let's "reset" vec[3] to an empty string by moving it to a temp and destroying the temp
reset(std::move(vec[3]));

这会将 vec[3] 的内部移动到 reset 函数的参数 t 中,然后是 的析构函数>t 清理内部结构。这使 vec[3] 成为一个空字符串。

这个特技的重要部分是我们不需要构造一个空字符串。这很重要,因为我的可移动类型可以移动,但不能默认构造。

我尝试过的其他事情:

{ std::move(somevar); } // this doesn't work

std::move 本身是行不通的,因为您必须实际将内容放在某个地方。

{ T t = std::move(somevar); } // works but cumbersome, and I have to name `T`

我只是在寻找一个可以像 reset(somevar) 这样调用的函数。那消耗了一些物体的灵魂。 std::move 部分还不错。这有点像 I expect you to die 的授权。所以在我看来,说 reset(std::move(somevar)) 没问题,但它并没有完成工作。所以,也许有一些其他功能可以做我想做的事。

那么,是否有一个 std::consume_soul 可以完成与将对象的内容移动到虚拟对象然后销毁虚拟对象,留下没有内容的原始对象(或移动构造函数会将其保留在什么状态)?

也许我没有意识到一些显而易见的方法?我觉得可能有一些我只是不知道的 super 简单的方法。

最佳答案

移动不是自动的,但是非常量引用是,所以你可以这样写

template<class T>
void dementor(T &t) {T(std::move(t));}

关于c++ - 如何消耗元素的灵魂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69842447/

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