gpt4 book ai didi

c++ - 将自由函数转换为 DefaultConstructible 函数对象

转载 作者:行者123 更新时间:2023-11-30 03:53:37 27 4
gpt4 key购买 nike

我正在寻找一种可以将自由函数转换为默认可构造函数对象的类型。

它应该是一个将函数作为模板参数的类模板:

template<typename F, F P>
struct fn_to_type {
template<class... Args>
decltype(auto) operator()(Args&&... args) {
return P(std::forward<Args>(args)...);
}
};

所以它可以作为容器和智能指针的模板参数:

bool CloseHandle(void* handle);
using UniqueHandle = std::unique_ptr<void, fn_to_type<decltype(&CloseHandle), &CloseHandle>>;

bool FooLess(const Foo& lhs, const Foo& rhs);
using FooSet = std::set<Foo, fn_to_type<decltype(&FooLess), &FooLess>>;

标准库肯定没有这样的功能,但也许 Boost 库有?

我也很好奇为什么这样的东西不在标准库中——有没有我看不到的陷阱?

如果没有库有这样的功能,有没有办法改进这个fn_to_type的东西?例如。做些什么来避免两次输入函数名称?

最佳答案

标准库已经有一个类可以将函数指针转换为默认可构造的类类型:

template <class T, T v>
struct integral_constant {
...
constexpr operator value_type() { return value; }
};

因此它可以用来代替 fn_to_type 类:

#include <type_traits>

bool CloseHandle(void* handle);
using UniqueHandle = std::unique_ptr<void, std::integral_constant<decltype(&CloseHandle), &CloseHandle>>;

bool FooLess(const Foo& lhs, const Foo& rhs);
using FooSet = std::set<Foo, std::integral_constant<decltype(&FooLess), &FooLess>>;

关于c++ - 将自由函数转换为 DefaultConstructible 函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com