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);