1

我有(感谢@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>(), "");

是否可以增强上述特征以适用于这些类型,或者我是否需要专业化,这些看起来如何?

4

0 回答 0