在C++中,如果要删除类型名称中的名称空间,可以使用std::remove_cvref_t
模板来实现。std::remove_cvref_t
是C++14引入的一个类型特征,用于移除类型的const
、volatile
和引用属性。
例如,如果有一个类型const std::vector<int>&
,可以使用std::remove_cvref_t
来移除const
、volatile
和引用属性,得到类型std::vector<int>
。
#include<iostream>
#include<vector>
#include <type_traits>
int main() {
using T = const std::vector<int>&;
using U = std::remove_cvref_t<T>;
std::cout << "Original type: "<< typeid(T).name()<< std::endl;
std::cout << "Removed type: "<< typeid(U).name()<< std::endl;
return 0;
}
输出结果:
Original type: PKSt6vectorIiSaIiEE
Removed type: St6vectorIiSaIiEE
在这个例子中,PKSt6vectorIiSaIiEE
是const std::vector<int>&
的类型名称,而St6vectorIiSaIiEE
是std::vector<int>
的类型名称。
需要注意的是,std::remove_cvref_t
只能移除const
、volatile
和引用属性,而不能移除名称空间。如果需要移除名称空间,可以使用C++17引入的std::remove_cvref_t
模板,它可以移除类型中的所有修饰符,包括名称空间。
例如,如果有一个类型std::vector<int>
,可以使用std::remove_cvref_t
来移除名称空间,得到类型vector<int>
。
#include<iostream>
#include<vector>
#include <type_traits>
int main() {
using T = std::vector<int>;
using U = std::remove_cvref_t<T>;
std::cout << "Original type: "<< typeid(T).name()<< std::endl;
std::cout << "Removed type: "<< typeid(U).name()<< std::endl;
return 0;
}
输出结果:
Original type: St6vectorIiSaIiEE
Removed type: St6vectorIiSaIiEE
在这个例子中,St6vectorIiSaIiEE
是std::vector<int>
的类型名称,而St6vectorIiSaIiEE
也是vector<int>
的类型名称。
领取专属 10元无门槛券
手把手带您无忧上云