7
我在写一个使用两个使用C接口创建的对象的类。对象看起来像:unique_ptr,自定义删除器和零规则
typedef struct... foo_t;
foo_t* create_foo(int, double, whatever);
void delete_foo(foo_t*);
(类似地为bar_t
)。因为C++ 11,我想把它们包装在一个智能指针中,所以我不必编写任何特殊的方法。本课程将有两个对象的唯一所有权,所以unique_ptr
逻辑意义......但我还是会写一个构造函数:
template <typename T>
using unique_ptr_deleter = std::unique_ptr<T, void(*)(T*)>;
struct MyClass {
unique_ptr_deleter<foo_t> foo_;
unique_ptr_deleter<bar_t> bar_;
MyClass()
: foo_{nullptr, delete_foo}
, bar_{nullptr, delete_bar}
{ }
~MyClass() = default;
void create(int x, double y, whatever z) {
foo_.reset(create_foo(x, y, z));
bar_.reset(create_bar(x, y, z));
};
在另一面,与shared_ptr
,我就不会去写一个构造函数,或者使用类型别名,因为我可以将delete_foo
传递到reset()
--尽管这会使我的MyClass
可复制,我不想那样做。
使用unique_ptr
语义编写MyClass
的正确方法是什么并仍然遵循零规则?
这看起来应该是标准库中的东西。 – rubenvb 2015-03-13 16:26:23
这很棒。我用'template struct unique_ptr_deleter;'有一个私人类'deleter',然后'使用type = std :: unique_ptr ;'。节省必要的输入量...然后我可以将它们放在一起('unique_ptr_deleter_t foo_;') –
Barry
2015-03-13 17:28:39