std::add_pointer
来自cppreference.com
定义于头文件 <type_traits>
|
||
template< class T > struct add_pointer; |
(C++11 起) | |
若 T
为引用类型,则提供成员 typedef type
,其为指向被引用类型的指针。
否则,若 T 指名对象类型、无 cv 或引用限定的函数类型或(可有 cv 限定的) void 类型,则提供成员 typedef type
,其为类型 T*
。
否则(若 T 为 cv 或引用限定的函数类型),提供成员 typedef type
,其为类型 T
。
成员类型
名称 | 定义 |
type
|
指向 T 或 T 所引用类型的指针
|
辅助类型
template< class T > using add_pointer_t = typename add_pointer<T>::type; |
(C++14 起) | |
可能的实现
namespace detail { template <class T> struct type_identity { using type = T; }; // 或使用 std::type_identity (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)) {}; |
示例
运行此代码
#include <iostream> #include <type_traits> int main() { int i = 123; int& ri = i; typedef std::add_pointer<decltype(i)>::type IntPtr; typedef std::add_pointer<decltype(ri)>::type IntPtr2; IntPtr pi = &i; std::cout << "i = " << i << "\n"; std::cout << "*pi = " << *pi << "\n"; static_assert(std::is_pointer<IntPtr>::value, "IntPtr should be a pointer"); static_assert(std::is_same<IntPtr, int*>::value, "IntPtr should be a pointer to int"); static_assert(std::is_same<IntPtr2, IntPtr>::value, "IntPtr2 should be equal to IntPtr"); typedef std::remove_pointer<IntPtr>::type IntAgain; IntAgain j = i; std::cout << "j = " << j << "\n"; static_assert(!std::is_pointer<IntAgain>::value, "IntAgain should not be a pointer"); static_assert(std::is_same<IntAgain, int>::value, "IntAgain should be equal to int"); }
输出:
i = 123 *pi = 123 j = 123
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2101 | C++11 | 曾要求 std::add_pointer 产生指向 cv 或引用限定的函数类型的指针。
|
产生 cv 或引用限定的函数类型自身。 |
参阅
(C++11) |
检查类型是否为指针类型 (类模板) |
(C++11) |
移除给定类型的一层指针 (类模板) |