我(感谢@Xeo)一个相对简单的is_convertible
实现:
template<typename From, typename To>
struct is_convertible
{
private:
static void foo(To);
template<typename F>
static auto test(int) -> decltype(foo(declval<F>()), void(), true_type{});
template<typename>
static auto test(...) -> false_type;
public:
static constexpr bool value = decltype(test<From>(0))::value;
constexpr operator bool() { return value; }
};
适用于“普通”内容,并且使用所有符合cv标准的void
版本进行扩充(我认为应该可以从我目前的void
的20个专业版中进行压缩),这非常有用。
问题出在我尝试数组和函数类型时:
typedef void Function();
typedef char Array[1];
然后这些测试失败了:
static_assert(!is_convertible<Function, Function>(), "");
static_assert(!is_convertible<Function&, Function>(), "");
static_assert(!is_convertible<Function*, Function>(), "");
static_assert(!is_convertible<Function*const, Function>(), "");
static_assert(!is_convertible<Array, const Array>(), "");
static_assert(!is_convertible<Array&, Array>(), "");
static_assert(!is_convertible<Array&, const Array>(), "");
static_assert(!is_convertible<const Array&, const Array>(), "");
static_assert(!is_convertible<char*, Array>(), "");
static_assert(!is_convertible<char*, const Array>(), "");
static_assert(!is_convertible<const char*, const Array>(), "");
上述特性是否可以扩充以适应这些类型,或者我是否需要专业化,这些看起来如何?