【问题标题】:Conditions for template specialization type?模板专业化类型的条件?
【发布时间】:2019-04-22 04:38:17
【问题描述】:

我已经在原始模板类的基础上制作了一个专门的模板,如下所示:

基础模板:

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*。但是,编译代码时没有错误。所以我想知道在类模板专业化中有没有这样的类型条件。

【问题讨论】:

  • 特化中的类型数量必须与原始非特化模板中的类型数量相匹配。除此之外,我无法说出你在问什么。不同的模板类型不相关,所以对它们没有要求……它们是完全不相关的类型,只是根据提供的类型选择。
  • 函数特化不是这样的——在特定情况下是这样,但如果参数是模板类型则不是这样。模板特化选择是在编译时完成的,因此它们不需要完全相同,因为它们的调用可以提前知道并且设置不同。

标签: c++


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多