父构造函数的模板特化 class

template specialization for constructor of a parent class

我得到了一个模板化的 BaseType,我想用 ArrayItem class 继承它。因为我想将它们用作内存模板,所以我希望 ArrayItem class 知道我们拥有哪种类型。所以我想专门针对一些模板值的构造函数,例如 long long。

    template<typename T>
    class ArrayItem : public BaseType<T>
    {
    public:
        inline ArrayItem(T& t);
        inline ETypes getType();
    private:
        ETypes m_type;
    };

hpp 应该是这样的:

template <typename T>
ArrayItem<T>::ArrayItem (T& t): BaseType(t)
{
}

template <>
ArrayItem<long long>::ArrayItem(long long& t) : BaseType<long long>(t) // this
{
    m_type = INT;
}


template<typename T>
inline ETypes ArrayItem<T>::getType()
{
    return m_type;
}

但是我如何在这里进行此专业化?


enum ETypes
{
    INT,
    BOOL,
    OBJECT,
    ARRAY,
    DOUBLE,
    STRING
};

template <typename T>
class BaseType
{
public:
    BaseType();
    explicit BaseType(T& t);

protected:
        union DataUnion
        {
            T data;
            size_t size; //to make it at least 64bit
        explicit DataUnion(T& t);
        } m_data;
};

template <typename T>
BaseType<T>::DataUnion::DataUnion(T& t)
{
    this->data = t;
}

template <typename T>
BaseType<T>::BaseType(T& t) : m_data(t) {}

template<typename T>
class ArrayItem : public BaseType<T>
{
public:
    explicit inline ArrayItem(T& t);
    inline ETypes getType();
private:
    ETypes m_type;
};

template <typename T>
ArrayItem<T>::ArrayItem (T& t): BaseType<T>(t)
{
}

template <>
ArrayItem<long long>::ArrayItem(long long& t) : BaseType<long long>(t) // this
{
    m_type = INT;
}

template<typename T>
inline ETypes ArrayItem<T>::getType()
{
    return m_type;
}

int main()
{
long long somenumber = 1234;
  ArrayItem<long long> item(somenumber);
  if(item.getType() == INT)
    std::cout<< "inttype";
//after this we can stancil the ptr to a
//BaseType<long long> since we know it's a long here
}

除了没有为典型案例提供 BaseType 的模板参数外,我觉得你的内容很合适。

这是一个简单的演示:

#include <iostream>

template <typename T>
struct B { };

template <typename T>
struct D : B<T> {
    D(T );
};

template <typename T>
D<T>::D(T )
    : B<T>()
{
    std::cout << "def\n";
}

template <>
D<long>::D(long ) 
    : B<long>()
{
    std::cout << "hi\n";
}

int main()
{
    D<int> i(4);  // prints def
    D<long> l(5); // prints hi
}