我有(感谢@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
版本(我认为应该可以从我目前的 20 个专业中压缩void
),非常有用。
问题是当我尝试数组和函数类型时:
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>(), "");
是否可以增强上述特征以适用于这些类型,或者我是否需要专业化,这些看起来如何?