我正在努力将这段代码变成一个单行代码:
std::string filename = "cats";
std::shared_ptr<bmd2::Bmd2Dataset> ptr (new bmd2::Bmd2Dataset(filename, bmd2::File::FM_WRITE));
bmd2::bmd2Session::getInstance().addDataset(ptr);
以上效果很好 - 但是我可以在不创建左值(行1 + 2)的情况下调用addDataset吗?
这是addDataset()的声明:
int addDataset(std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception);
答案 0 :(得分:3)
bmd2::bmd2Session::getInstance().addDataset(
std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE)
);
一位州长。 :)
有趣。出于学习目的,您是否可以告诉我是否可以在没有make_shared()函数调用的情况下完成此操作?
您可以使用C ++ 11的大括号初始化语法。假设addDataset
不是模板且其std::shared_ptr<bmd2::Bmd2Dataset>
为参数,
bmd2::bmd2Session::getInstance().addDataset(
{ new bmd2::Bmd2Dataset("cats", bmd2::File::FM_WRITE) }
);
更新:糟糕。所以addDataset()
实际上接受 l-value 引用为什么你不立即这么说?。 addDataset()
的参数不能绑定到r值参数,在上面两个示例中都是如此。要解决此问题,您可以:
将addDataset()
的参数设为const
参考
int addDataset(const std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception);
// ^^^^^
如果您不需要修改传递的shared_ptr
参数(即修改它以使其指向另一个对象),请执行此操作。
使用旧方法,但直接将。 更新:使用"cat"
传递到new
表达式std::make_shared
!
auto ptr = std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE);
bmd2::bmd2Session::getInstance().addDataset(ptr);
// ptr might now point to some other object
如果您希望更改传递的参数(ptr
)值(即在调用之后它可能指向新对象),请执行此操作。