我的代码如下:
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
...
答案 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;