将自由函数转换为DefaultConstructible函数对象

时间:2015-05-04 21:33:59

标签: c++

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

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

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 ); } 的东西?例如。做些什么来避免两次输入功能名称?

1 个答案:

答案 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>>;