为函数和数组类型实现is_convertible trait

时间:2013-05-10 09:46:57

标签: c++ types c++11 type-conversion typetraits

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

上述特性是否可以扩充以适应这些类型,或者我是否需要专业化,这些看起来如何?

0 个答案:

没有答案