2

我正在尝试找到一种方法来获取模板参数的基类。

考虑以下类:

template <class C>
class Foo
{
    public:
        Foo(){};
        ~Foo(){};
        C* ptr;
};

如果C是引用(例如Test&),则ptr是类型 C&*

但无论 C 是引用、指针还是其他任何东西,我都需要获取基类的指针。

  • 如果CTest&然后ptr需要是Test*
  • 如果CTest*那么ptr需要是Test*
  • 如果CTest那么ptr需要是Test*等等。

反正有没有得到 C 的“基”类,所以我可以创建我需要的指针?

4

4 回答 4

8

如果你真的需要底层元素类型,你可以使用移除类型操作特征的递归应用:

#include <type_traits>

// precv = pointer, reference, extents, const, and volatile
template <typename T>
struct remove_precv
{
    typedef typename std::remove_pointer<
            typename std::remove_reference<
            typename std::remove_all_extents<
            typename std::remove_cv<T>::type>::type>::type>::type type;
};

template <typename T, typename U>
struct element_type_impl
{
    typedef typename element_type_impl<
            typename remove_precv<T>::type, T>::type type;
};

template <typename T>
struct element_type_impl<T, T>
{
    typedef T type;
};

template <typename T>
struct element_type
{
    struct null_type { };
    typedef typename element_type_impl<T, null_type>::type type;
};

例如,element_type<int***[42]>::typeint

于 2012-04-25T20:22:48.300 回答
3

做这个:

#include <type_traits>

template <typename T>
class Foo
{
    typedef typename std::remove_pointer<typename std::decay<T>::type>::type C;
    // ...
};

decay删除引用和 CV 限定,并remove_pointer删除指针。

于 2012-04-25T20:18:54.023 回答
2

怎么用std::remove_reference

#include <type_traits>

template <class C>
class Foo
{
    public:
        Foo(){};
        ~Foo(){};
        std::remove_reference<C>::type *ptr;
};
于 2012-04-25T20:18:46.467 回答
2

您可以通过一些模板元编程来做到这一点,例如:

#include <cassert>
#include <typeinfo>

template <typename T>
struct unpoint {
  typedef T type;
};

template <typename T>
struct unpoint<T*> {
  typedef typename unpoint<T>::type type;
};

int main() {
  int *a;
  int **b;
  int ***c;
  int ****d;

  const std::type_info& t1=typeid(unpoint<decltype(a)>::type);
  const std::type_info& t2=typeid(unpoint<decltype(b)>::type);
  const std::type_info& t3=typeid(unpoint<decltype(c)>::type);
  const std::type_info& t4=typeid(unpoint<decltype(d)>::type);
  assert(t1 == t2);
  assert(t1 == t3);
  assert(t1 == t4);
}

的特化unpoint删除指针并递归调用自身,直到类型中没有指针为止。

于 2012-04-25T20:26:13.773 回答