【发布时间】:2019-08-15 07:14:37
【问题描述】:
可能的实现
namespace detail {
template <class T>
struct type_identity { using type = T; }; // or use std::type_identity (since C++20)
template <class T>
auto try_add_pointer(int) -> type_identity<typename std::remove_reference<T>::type*>;
template <class T>
auto try_add_pointer(...) -> type_identity<T>;
} // namespace detail
template <class T>
struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {};
上述(可能的)实现的描述如下:
如果 T 是引用类型,则提供成员 typedef type 是指向被引用类型的指针。
否则,如果 T 命名一个对象类型,一个函数类型不是 cv- 或 ref-qualified,或(可能是 cv-qualified)void 类型,提供 成员typedef type,即类型T*。
否则(如果 T 是 cv 或 ref 限定的函数类型),则提供 成员typedef type,即类型T。
在上面的(可能的)实现代码中,显然struct add_pointer 派生自detail::try_add_pointer<T>(0) 返回的类型。
从detail::try_add_pointer<T> 的重载返回的类型派生出int 参数,以将成员typedef type 解析为上述三种可能性之一的逻辑是什么?具体来说,如果T 是cv- 或ref-qualified 函数类型,这将如何解决这种可能性?
【问题讨论】:
-
上述(可能的)实现的描述为:
If T is a reference type, then provides the member typedef type which is a pointer to the referred type.然后立即删除此评论。 GN DD 有什么问题吗?我们在解决什么What is the logic behind deriving from the type returned by the overload of我什至不确定这是否真的有意义...... -
可以是
struct add_pointer :,而不是using add_pointer =。 -
O rite 所以这意味着语法不同 rigth Symbols Numbers 那条评论是什么。
-
我认为这意味着你正在引用一个命名空间或类似的东西 4 real