标准的c++11方法删除一个类型的所有指针

standard c++11 way to remove all pointers of a type

本文关键字:类型 一个 指针 方法 c++11 删除 标准      更新时间:2023-10-16

有没有一种方法可以用一些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都没有这样的特性模板。但是您的代码应该可以工作。

相关文章: