C++ 具有lambda deleter的唯一\u ptr
我有一些函数需要使用成员变量(自定义类的向量)。C++ 具有lambda deleter的唯一\u ptr,c++,lambda,C++,Lambda,我有一些函数需要使用成员变量(自定义类的向量)。 在该功能结束时,需要清除该成员,但在该功能期间,该成员需要保持成员身份。 另一个问题是,由于程序的自定义错误处理,函数可能过早结束。然而,该成员国仍然需要获得批准 使用,我得到了以下代码: #include <iostream> #include <vector> #include <memory> using namespace std; class A { public: A() {
在该功能结束时,需要清除该成员,但在该功能期间,该成员需要保持成员身份。 另一个问题是,由于程序的自定义错误处理,函数可能过早结束。然而,该成员国仍然需要获得批准 使用,我得到了以下代码:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class A
{
public:
A()
{
m_numbers = { { 3, 1 ,4, 1, 5} };
}
void display()
{
auto cleanNumber = [](decltype(m_numbers)* numbers){
if(numbers)
move(*numbers);
};
auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers);
for(int number: m_numbers)
cout << number << endl;
}
private:
vector<int> m_numbers;
};
int main()
{
A a;
a.display();
cout << "should be empty now" << endl;
a.display();
return 0;
}
#包括
#包括
#包括
使用名称空间std;
甲级
{
公众:
()
{
m_数={3,1,4,1,5};
}
无效显示()
{
自动清洗编号=[](decltype(m_编号)*编号){
如果(数字)
移动(*数字);
};
auto pClean=std::唯一的ptr(&m_编号);
用于(整数:m_数)
cout您需要将cleanNumber
传递到unique\ptr
构造函数:
auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);
auto-pClean=std::unique_ptr(&m_编号,cleanNumber);
另外,由于move(*numbers);
什么也不做,所以您的lambda不清除向量内容。您应该改为编写numbers->clear();
。几件事:看起来您想要实现一个,您不需要为此使用唯一的ptr!其次,只需调用move(*numbers)如果不执行任何操作,则需要将此值分配给稍后删除的某个局部变量already@TobiasRibizel我现在正在阅读scope guard,我想这可能就是@TobiasRibizel的答案。我阅读了scope guard链接,虽然它看起来像e我想要的是,除非有一些std实现的范围保护,否则我不认为这会更好。据我所知,std库中没有通用的实现,但使用unique_ptr
,因为这是解决原始问题的一种相当丑陋的方法。如果经常需要这样的范围保护,添加一个简单的10 line实现不会有什么坏处;)美在旁观者眼中,我发现额外的类比这个更难看。但是如果我需要在不同的地方使用它,我可能会为它添加一个单独的类,就像我在被指向此解决方案之前最初做的那样。谢谢。在这里,Clear确实更好。我仍然使用move作为一个refactoring工件,但现在不需要了。
auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);