模板专业化类型的条件?

时间:2019-04-22 04:38:17

标签: c++

我已经基于原始模板类制作了专门的模板,如下所示:

基本模板:

template <typename T>
class MyData {
public:
    MyData(T param) : data(param) {}

    T GetData() const {
        return data;
    }

private:
    T data;
};

专业模板:

template <>
class MyData<char*> {
public:
    MyData(const char* param) {
        int len = static_cast<int>(strlen(param));
        data = new char[len + 1];
        strcpy_s(data, static_cast<rsize_t>(len + 1), param);
    }

    ~MyData() {
        delete[] data;
    }

    const char* GetData() const {
        return data;
    }

private:
    char* data;
};

这段代码很好用,但是我想知道模板专业化类型是否有任何明确的条件。例如,如果我使函数专门化,则返回类型和所有参数的类型必须相同。

template <>
const char* Add(const char* pLeft, const char* pRight) {
-----------     -----------        -----------
     |                |                  |
     +----------------+------------------+
    ...
}

在类MyData中,类的模板类型为char*,但构造函数的参数类型为const char*。但是,编译代码时没有错误。所以我想知道在类模板专门化中是否有像这样的类型条件。

1 个答案:

答案 0 :(得分:1)

在这里,函数专长和类专长是有区别的。类的专业化可能与另一组成员,函数和基类完全不同。以下内容可以很好地编译:

template <typename T>
class Foo
{
public:
    void Bar() {}

private:
    int val;
};

class Parent {};

template <>
class Foo<char> : public Parent
{
public:
    void BarBar() {}

private:
    double val;
};

int main()
{
    Foo<int> f;
    Foo<char> ff;
}