我想用自定义删除器声明 std::unique_ptr
,它将一些参数绑定(bind)到特定函数:
using namespace std::placeholders;
using HandleDeleter = std::invoke_result_t<std::bind, _1, SOME_FLAG>; // !!!
using HandlePtr = std::unique_ptr<handle_t, HandleDeleter>;
void handle_destroy(handle_t *, int flags);
handle_t * raw_handle;
auto deleter = std::bind(handle_destroy, _1, SOME_FLAG);
HandlePtr ptr(raw_handle, deleter);
这行不通,因为 std::bind
本身就是一个巨大的模板构造,具有未指定的返回类型。
如何在我的案例中正确声明 HandleDeleter
?
最佳答案
std::bind
不是一个单独的可调用函数,而是一个函数模板。因此,您必须选择将哪一个传递给 std::invoke_result_t
,这真的很麻烦。
幸运的是,还有更好的选择:
使用
decltype
:using deleter_t = decltype(std::bind(handle_destroy, _1, SOME_FLAG));
为类使用模板参数推导:
unique_ptr ptr(raw_handle, deleter);
无论如何,不使用 std::bind()
通常更简单,并且由于对使用的函数和参数进行硬编码而更有效。尽管您当然可以自由地只硬编码部分:
使用 lambda 代替
std::bind()
。在 C++20 中,无状态的 lambda 甚至可以默认构造:auto deleter = [](handle_t* p){ handle_destroy(p, SOME_FLAG); };
定义您自己的自定义删除器类,而不是使用
std::bind
:struct deleter_t { constexpr void operator()(handle_t* p) const noexcept { handle_destroy(p, SOME_FLAG); } };
关于c++ - 如何在 C++ 中声明 std::bind 的 std::invoke_result?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56683940/