我正在寻找一种将自由函数转换为默认可构造函数对象的类型。
它应该是一个类模板,它将该函数作为模板参数:
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>>;
因此它可以用作容器和智能指针的模板参数:
fn_to_type
标准库肯定没有这样的功能,但Boost库可能会这样做吗?
此外,我很好奇为什么标准库中没有这样的东西 - 是否有任何陷阱我无法看到?
如果没有具有此类功能的库,有没有办法改进这个public void actionPerformed(ActionEvent e)
{
if (label.getIcon() == null)
label.setIcon(...);
else
label.setIcon( null );
}
的东西?例如。做些什么来避免两次输入功能名称?
答案 0 :(得分:2)
标准库已经有一个类,它可以将函数指针转换为默认可构造的类类型:
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>>;