标准的c++11方法删除一个类型的所有指针
standard c++11 way to remove all pointers of a type
有没有一种方法可以用一些c++11或最多一个boost库来实现这一点?
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T> class remove_all_pointers{
public:
typedef T type;
};
template <typename T> class remove_all_pointers<T*>{
public:
typedef typename remove_all_pointers<T>::type type;
};
int main(){
//correctly prints 'i' on gcc
cout<<typeid(remove_all_pointers<int****>::type).name()<<endl;
}
这并不能完全适用于所有指针类型。您还需要考虑不同的简历限定符:
template <typename T> class remove_all_pointers<T* const>{
public:
typedef typename remove_all_pointers<T>::type type;
};
template <typename T> class remove_all_pointers<T* volatile>{
public:
typedef typename remove_all_pointers<T>::type type;
};
template <typename T> class remove_all_pointers<T* const volatile >{
public:
typedef typename remove_all_pointers<T>::type type;
};
由于C++17,您可以创建一个可读、简单且具有cv限定符意识的元函数。
像一样使用
int main()
{
remove_all_pointers_t<int* const* volatile* const volatile*> v = 42;
return 0;
}
C++20
#include <type_traits>
template<typename T>
struct remove_all_pointers : std::conditional_t<
std::is_pointer_v<T>,
remove_all_pointers<
std::remove_pointer_t<T>
>,
std::type_identity<T>
>
{};
template<typename T>
using remove_all_pointers_t = typename remove_all_pointers<T>::type;
C++17
在C++17中,std::type_identity
还不可用,std::identity
也不可用,因此您需要创建自己的"身份"元函数:
#include <type_traits>
// your custom 'identity' meta function
template <typename T>
struct identity
{
using type = T;
};
template<typename T>
struct remove_all_pointers : std::conditional_t<
std::is_pointer_v<T>,
remove_all_pointers<
std::remove_pointer_t<T>
>,
identity<T>
>
{};
template<typename T>
using remove_all_pointers_t = typename remove_all_pointers<T>::type;
Boost和C++11都没有这样的特性模板。但是您的代码应该可以工作。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 构造函数正在调用一个使用当前类类型的函数
- 引用一个已擦除类型(void*)的指针
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- visual是否可以在c++中创建一个接收无限数量相同类型(或至少相当数量)参数的函数
- 在c++中为double类型的数组创建一个unique_ptr
- 当基类是依赖类型时,这是一个缺陷吗
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- C++将一个指针分配给另一个指针时执行的类型检查
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 取消引用结束指针到数组类型的一个
- 为什么转换函数声明不需要至少一个定义类型说明符
- 如何包装一个函数以适应另一个函数的所需类型
- 使用C++生成泛型类型-一个具有共享实现的模板