如何从T,T&或T*模板参数中获取T*

Val*_*kea 2 c++ templates pointers reference

我试图找到一种方法来获取模板参数的基类.

考虑以下课程:

template <class C>
class Foo
{
    public:
        Foo(){};
        ~Foo(){};
        C* ptr;
};
Run Code Online (Sandbox Code Playgroud)

如果C是参考(例如Test&)那么ptr是C&*

但我需要得到一个指针基类,无论C是引用,指针还是其他任何东西.

  • 如果C测试然后ptr需要测试*,
  • 如果CTest*那么ptr需要是Test*,
  • 如果CTest,那么ptr需要是Test*等.

反正有没有获得C的"基础"类,所以我可以创建我需要的指针?

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

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

  • 而不是`remove_precv`,我认为`std :: decay`也可能在这里起作用,如Kerrek SB的回答中所述.我不熟悉那个操纵特征,我不太清楚它的行为是什么. (2认同)