如何转发声明自定义unique_ptr
How to forward declare custom unique_ptr
我在实现如下结构时遇到问题。这个想法是,我在一些头文件中定义了一个实用程序函数,用于分配某种资源。为了减轻客户自己释放它的必要性,我想把它包装成一个智能指针。不幸的是,我不得不以某种方式将deleter类型发送到客户端,并且在正确地向前声明它时遇到了问题。我目前的解决方案是这样的,导致了多个定义错误,因为删除程序是用每个附加的实用程序重新定义的。h
我正在寻找哪种优雅的解决方案?
// utilities.h
namespace foo
{
auto del = []( MyResource* res) { Deallocate( res ); };
std::unique_ptr<MyResource, decltype(del)> getResource( );
}
// utilities.cpp
namespace foo
{
std::unique_ptr<MyResource, decltype(foo::del)> getResource( )
{
return std::unique_ptr<MyResource, decltype(foo::del)>( Allocate( ), del );
}
}
使用普通类而不是lambda:
标题:
namespace foo {
struct Deleter {
void operator() (MyResource *res) const { Deallocate(res); }
};
std::unique_ptr<MyResource, Deleter> getResource();
}
来源:
namespace foo
{
std::unique_ptr<MyResource, decltype(foo::del)> getResource( )
{
return std::unique_ptr<MyResource, Deleter>( Allocate( ) );
}
}
这还有一个额外的优点,即在创建指针时不必指定删除程序—默认构造的CCD_ 1将做得很好。
我推荐Angew的答案,主要是因为std::function
中类型擦除的额外开销。然而,知道这种方式也有可能是不好的。
修复方法很简单:在标头中有声明,在源代码中有定义:
// utilities.h
namespace foo {
using del_t = std::function<void(MyResource *)>;
extern del_t del;
std::unique_ptr<MyResource, del_t> getResource();
}
// utilities.cpp
namespace foo {
del = [](MyResource* res) {
Deallocate(res);
};
std::unique_ptr<MyResource, del_t> getResource() {
return std::unique_ptr<MyResource, del_t>(Allocate(), del);
}
}
相关文章:
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- C++自定义比较函数
- 如何比较自定义类的std::变体
- std::设置自定义比较器
- 如何正确实现和访问运算符的各种自定义枚举器
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 自定义先决条件对移动分配运算符有效吗
- 使用VS Code和CMake Tools运行自定义命令
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- std::ranges::elements_view,用于自定义类似元组的数据
- 跟随整数索引列表的自定义类迭代器
- 参数化自定义CMake工具链
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何在自定义类中启用'auto loops'?
- 使用QJsEngine在Qt中注册自定义类型
- Qt自定义QPush按钮未显示在布局上
- 自定义对象的dlib序列化在gcc中失败
- 如何在C++03中用自定义谓词调用std::unique
- 从自定义对象- std:unique的向量中消除重复项会导致崩溃