Как я могу определить шаблонный класс, который дает указатель глубину / уровень типа? - PullRequest
7 голосов
/ 02 апреля 2011

Как я могу определить класс шаблона, который предоставляет целочисленную константу, представляющую «глубину» (указателя) типа, предоставленного в качестве входного аргумента шаблона? Например, если класс был назван Depth, было бы верно следующее:

Depth<int ***>::value == 3
Depth<int>::value == 0

Ответы [ 2 ]

14 голосов
/ 02 апреля 2011
template <typename T> 
struct pointer_depth_impl
{
    enum { value = 0 };
};

template <typename T>
struct pointer_depth_impl<T* const volatile>
{
    enum { value = pointer_depth_impl<T const volatile>::value + 1 };
};

template <typename T>
struct pointer_depth
{
    enum { value = pointer_depth_impl<T const volatile>::value };
};
4 голосов
/ 02 апреля 2011

Это можно сделать с помощью рекурсии.

template<typename T>
struct Depth
{
    enum { value = 0 };
};

template<typename T>
struct Depth<T*>
{
    enum { value = Depth<T>::value + 1 };
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...