将此原始指针情况转换为unique_ptr?

时间:2015-06-12 13:14:20

标签: c++ c++11 smart-pointers unique-ptr

我的代码如下:

ISessionUpdater* updater = nullptr;
if (eventName == "test")
    updater = new TestJSONSessionUpdater(doc);
if (eventName == "plus")
    updater = new PlusJSONSessionUpdater(doc);

if (updater)
{
    bool result = updater->update(data);
    delete updater;
    return result;
}
return false;

有没有办法做这样的事情但是unique_ptr

也就是说,只有1次呼叫update(data)而不是:

if(cond)
make unique
call update
end
if(cond)
make unique
call update
end
...

3 个答案:

答案 0 :(得分:8)

您的代码就像这样简单:

    std::unique_ptr<ISessionUpdater> updater;
    if (eventName == "test")
        updater = std::make_unique<TestJSONSessionUpdater>(doc);
    if (eventName == "plus")
        updater = std::make_unique<PlusJSONSessionUpdater>(doc);

    return updater ? updater->update(data) : false;

您可以使用与原始指针

几乎相同的方式检查std::unique_ptr

注意如何使用RAII简化呼叫部分。

答案 1 :(得分:4)

您可以使用std::unique_ptr分配新的std::make_unique,如果旧指针已有,则会销毁旧的内部原始指针。

std::unique_ptr<ISessionUpdater> updater = nullptr;
if (eventName == "test")
    updater = std::make_unique<TestJSONSessionUpdater>(doc);
if (eventName == "plus")
    updater = std::make_unique<PlusJSONSessionUpdater>(doc);

if (updater)
{
    bool result = updater->update(data);
    return result;
}
return false;

答案 2 :(得分:3)

unique_ptr<>operator bool转换,可用于查询智能指针是否包含对象

std::unique_ptr<int> ptr;
if (ptr) // Not yet assigned
   std::cout << "This isn't printed";

因此您的代码变为

std::unique_ptr<ISessionUpdater> updater = nullptr;
if (eventName == "test")
    updater = std::make_unique<TestJSONSessionUpdater>(doc);
if (eventName == "plus")
    updater = std::make_unique<PlusJSONSessionUpdater>(doc);

if (updater) // If this smart pointer owns an object, execute the block
{
    bool result = updater->update(data);
    return result;
}
return false;