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

Lor*_*one 11 c++ boost type-traits c++11

有没有办法用一些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;
}
Run Code Online (Sandbox Code Playgroud)

MSN*_*MSN 5

这对所有指针类型都不起作用.您还需要考虑不同的cv限定符:

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;
};
Run Code Online (Sandbox Code Playgroud)


kla*_*ndl 5

从 C++17 开始,您可以创建一个可读的、简单的和 cv 限定符感知的元函数。

像这样使用它:

int main()
{
    remove_all_pointers_t<int* const* volatile* const volatile*> v = 42;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

C++17

在 C++17std::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;
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 2

Boost 和 C++11 都没有这样的特征模板。但你的代码应该可以工作。