类型特性
类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。
试图特化定义于 <type_traits> 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。
定义于<type_traits>头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实例化标准库模板。
类型修改
类型修改模板通过应用修改到模板参数,创建新类型定义。结果类型可以通过成员 typedef type
访问。
从给定类型移除 const 或/与 volatile 限定符
std::remove_cv,
std::remove_const,
std::remove_volatile
template< class T > | (1) | (C++11 起) |
template< class T > | (2) | (C++11 起) |
template< class T > | (3) | (C++11 起) |
提供与 T
相同的成员 typedef type
,除了其最顶层 cv 限定符被移除。
1) 移除最顶层 const 、最顶层 volatile 或两者,若存在。
2) 移除最顶层 const
3) 移除最顶层 volatile
成员类型
名称 | 定义 |
type | 无 cv 限定符的 T |
辅助类型
template< class T > | (C++14 起) | |
template< class T > | (C++14 起) | |
template< class T > | (C++14 起) |
可能的实现
template< class T >
struct remove_cv {
typedef typename std::remove_volatile<typename std::remove_const<T>::type>::type type;
};
template< class T > struct remove_const { typedef T type; };
template< class T > struct remove_const<const T> { typedef T type; };
template< class T > struct remove_volatile { typedef T type; };
template< class T > struct remove_volatile<volatile T> { typedef T type; };
调用示例
#include <iostream>
#include <type_traits>
int main()
{
typedef std::remove_cv<const int>::type CVtype1;
typedef std::remove_cv<volatile int>::type CVtype2;
typedef std::remove_cv<const volatile int>::type CVtype3;
typedef std::remove_cv<const volatile int*>::type CVtype4;
typedef std::remove_cv<int * const volatile>::type CVtype5;
std::cout << "std::is_same<int, std::remove_cv<const int>::type>::value: "
<< (std::is_same<int, CVtype1>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_cv<volatile int>::type>::value: "
<< (std::is_same<int, CVtype2>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_cv<const volatile int>::type>::value:"
<< (std::is_same<int, CVtype3>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<const volatile int*, std::remove_cv<const volatile int*>::type>::value: "
<< (std::is_same<const volatile int*, CVtype4>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int*, std::remove_cv<int * const volatile>::type>::value: "
<< (std::is_same<int*, CVtype5>::value ? "passed" : "failed") << std::endl;
std::cout << std::endl;
typedef std::remove_const<const int>::type Ctype1;
typedef std::remove_const<volatile int>::type Ctype2;
typedef std::remove_const<const volatile int>::type Ctype3;
typedef std::remove_const<const volatile int*>::type Ctype4;
typedef std::remove_const<int * const volatile>::type Ctype5;
std::cout << "std::is_same<int, std::remove_const<const int>::type>::value: "
<< (std::is_same<int, Ctype1>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_const<volatile int>::type>::value: "
<< (std::is_same<int, Ctype2>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_const<const volatile int>::type>::value:"
<< (std::is_same<int, Ctype3>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<const volatile int*, std::remove_const<const volatile int*>::type>::value: "
<< (std::is_same<const volatile int*, Ctype4>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int*, std::remove_const<int * const volatile>::type>::value: "
<< (std::is_same<int*, Ctype5>::value ? "passed" : "failed") << std::endl;
std::cout << std::endl;
typedef std::remove_volatile<const int>::type Vtype1;
typedef std::remove_volatile<volatile int>::type Vtype2;
typedef std::remove_volatile<const volatile int>::type Vtype3;
typedef std::remove_volatile<const volatile int*>::type Vtype4;
typedef std::remove_volatile<int * const volatile>::type Vtype5;
std::cout << "std::is_same<int, std::remove_volatile<const int>::type>::value: "
<< (std::is_same<int, Vtype1>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_volatile<volatile int>::type>::value: "
<< (std::is_same<int, Vtype2>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int, std::remove_volatile<const volatile int>::type>::value:"
<< (std::is_same<int, Vtype3>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<const volatile int*, std::remove_volatile<const volatile int*>::type>::value: "
<< (std::is_same<const volatile int*, Vtype4>::value ? "passed" : "failed") << std::endl;
std::cout << "std::is_same<int*, std::remove_volatile<int * const volatile>::type>::value: "
<< (std::is_same<int*, Vtype5>::value ? "passed" : "failed") << std::endl;
std::cout << std::endl;
return 0;
}
输出
std::is_same<int, std::remove_cv<const int>::type>::value: passed
std::is_same<int, std::remove_cv<volatile int>::type>::value: passed
std::is_same<int, std::remove_cv<const volatile int>::type>::value:passed
std::is_same<const volatile int*, std::remove_cv<const volatile int*>::type>::value: passed
std::is_same<int*, std::remove_cv<int * const volatile>::type>::value: passed
std::is_same<int, std::remove_const<const int>::type>::value: passed
std::is_same<int, std::remove_const<volatile int>::type>::value: failed
std::is_same<int, std::remove_const<const volatile int>::type>::value:failed
std::is_same<const volatile int*, std::remove_const<const volatile int*>::type>::value: passed
std::is_same<int*, std::remove_const<int * const volatile>::type>::value: failed
std::is_same<int, std::remove_volatile<const int>::type>::value: failed
std::is_same<int, std::remove_volatile<volatile int>::type>::value: passed
std::is_same<int, std::remove_volatile<const volatile int>::type>::value:failed
std::is_same<const volatile int*, std::remove_volatile<const volatile int*>::type>::value: passed
std::is_same<int*, std::remove_volatile<int * const volatile>::type>::value: failed