【发布时间】:2018-01-03 19:42:02
【问题描述】:
我正在制作一个辅助函数来加载共享库并将结果放入带有自定义删除器的std::unique_ptr(这是模块破坏函数)。
当我没有设置自定义删除器时,这很好用,但是一旦我添加它们,我就会收到一条错误消息,指出无法推断自定义删除器的类型(这是公平的)。
问题是,如果我在调用函数时在哪里指定删除器类型,它最终会看起来很丑。
问题是,我的函数如何自动推断自定义删除器的类型?我应该如何声明 std::vector 的结果 std::unique_ptrs ?
我的代码(我也愿意对代码提出任何建议):
template <typename T, typename D>
std::unique_ptr<T, D> openLib(const std::string &lib_path,
const std::string &csym = "create",
const std::string &dsym = "destroy")
{
void *handle;
if (!(handle = dlopen(lib_path.c_str(), RTLD_LAZY)))
{
std::cerr << "dlopen " << dlerror() << std::endl;
return nullptr;
}
T *(*create)();
if (!(create = (T * (*)()) dlsym(handle, csym.c_str())))
{
std::cerr << "dlsym " << csym << dlerror() << std::endl;
return nullptr;
}
void (*destroy)();
if (!(destroy = (void (*)()) dlsym(handle, dsym.c_str())))
{
std::cerr << "dlsym " << dsym << dlerror() << std::endl;
return nullptr;
}
auto cDel = [destroy](T *lib) { destroy(); };
std::unique_ptr<T, decltype(cDel)> lib_ptr((T *)create(), cDel);
return lib_ptr;
}
【问题讨论】:
-
为什么
destroy返回一个T*? -
我猜我复制和粘贴创建部分有点太快了,编辑它;)
-
T究竟在这里玩什么?似乎T应该只是void而这根本不需要是模板?
标签: c++ c++14 unique-ptr