我正在处理与new_
和free_
方法相关联的C类型。
的类型签名new_
可能有所不同,但是free_
始终为void free_something(something*);
目前,我正在unique_ptr
以这种方式声明自己的,这似乎过于冗长:
std::unique_ptr<qdr_link_t, decltype(&free_qdr_link_t)> link{new_qdr_link_t(), free_qdr_link_t};
我能以更少的仪式做到这一点吗?std::free()
在https://stackoverflow.com/a/43626234/1047788上,当我的deallocator是函数时,我看到了一种巧妙的解决方案。我试图创建一个可以参数化deallocator的版本,但是却无所适从。
我能想到的最好的办法就是从上述声明中创建一个宏。
让语言来努力!
#include <memory>
struct qdr_link_t;
qdr_link_t* new_qdr_link_t();
void free_qdr_link_t(qdr_link_t*);
template <typename T, typename Deleter>
auto make_unique_ptr(T* raw, Deleter deleter)
{
return std::unique_ptr<T, Deleter>(raw, deleter);
}
//std::unique_ptr<qdr_link_t, decltype(&free_qdr_link_t)> link{new_qdr_link_t(), free_qdr_link_t};
auto link = make_unique_ptr(new_qdr_link_t(), free_qdr_link_t);
增加std::forward
口味(如果您在乎)。
对于C ++ 11,您需要将尾随的返回类型添加-> std::unique_ptr<T, Deleter>
到中make_unique_ptr
,或仅将其放入“正常”返回类型中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句