c++ - 如何从 T、T& 或 T* 模板参数中获取 T*

标签 c++ templates pointers reference

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

考虑以下类:

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 的“基”类,这样我就可以创建我需要的指针?

最佳答案

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

#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 .

关于c++ - 如何从 T、T& 或 T* 模板参数中获取 T*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10323018/

相关文章:

c++ - 交换 float 和 double 的 "endianness"

c++ - 从用户模式访问 Windows Native API

c++ - 具有方法重载的接口(interface)类?

c++ - 将函数绑定(bind)到范围以生成迭代函数

c++ - 为什么在Friend函数中调用析构函数

c++ - shared_from_this 和 this 的用例

c++ - 如何使用 unique_ptr 将 const 指针传递给 const 对象

c++ - 通过模板滥用的函数式 C++

c - 该堆栈程序的内存分配不均匀

类型转换指针警告