C++ 函数和数组类型的实现是可转换的
由于@Xeo,我有一个相对简单的C++ 函数和数组类型的实现是可转换的,c++,types,c++11,type-conversion,typetraits,C++,Types,C++11,Type Conversion,Typetraits,由于@Xeo,我有一个相对简单的可转换的实现: 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&l
可转换的实现:
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; }
};
然后这些测试失败:
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>(), "");
static_assert(!is_convertable(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
静态断言(!is_convertible(),“”);
上述特性是否可以扩展以适用于这些类型,或者我是否需要专门化,以及它们的外观如何?为什么static auto test(int)->decltype(foo(declval()),void(),true_type{})
?@AndyProwl这是@Xeo防止用户定义的操作符
把事情搞砸的伎俩。他说你不能在void
上超载操作员。
。哦,我明白了。我永远也不会明白这一点,谢谢你,对函数和数组类型进行部分专门化is\u convertible
不是一种选择吗?在何种意义上它们失败了?在g++4.8和clang++3.2上,所有形式的静态断言(::is_convertible(),“”)
(注意:不!
)与A、B(来自您给出的示例)pass==均未触发。例如,数组
不应该转换为数组&
?
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>(), "");