C++模板:如果我们把错误的东西放在模板类中会发生什么

C++ Template: What happens if we put wrong thing in our template class

本文关键字:什么 如果 模板 我们 错误 C++      更新时间:2023-10-16

C++模板允许我们使用模板参数将任何内容放入对象中。但是,如果我们的模板参数使用属于某些类型的函数/变量,我们该如何检查?

template<typename BarType>rguments
class Foo {
public:
     Foo() { bar = new BarType() }
private:
     BarType * bar;
}
Foo<Bar> …

BarType可以是从Bar超类派生的任何对象。

如果我们调用一些只属于Foo类中Bar的函数,会发生什么?如果我们通过非BarType,会发生什么?我们还要检查一下吗?

如果您的模板化代码引用了在您尝试实例化模板时实际参数没有提供的成员,则会出现编译时错误。所以别担心,你不会打碎任何东西的。

将模板视为一种代码生成机制。生成的代码是否真的有意义有时只能在你实际尝试时才能确定。

给定下面的类模板TempFoo,您可以看到它在构造函数中调用了模板化T类型的example函数。前两种类型之所以有效,是因为它们都定义了example;第三个没有。

template<typename T>
class TempFoo
{
    void TempFoo() {
        T obj;
        obj.example();
    }
};
class First {
    void example() {}
};
class Second {
    void example() {}
};
class Third {
};
int main()
{
     TempFoo<First> f; // works
     TempFoo<Second> s; // works
     TempFoo<Third> t; // doesn't
}

无论您在tempalte参数列表中给出什么,都只是一个占位符。编译器将根据用于实例化模板类的对象的类型,重新使用适当的类型。如果对象不能满足函数中的操作,则会出现编译时错误。此外,使用"T"作为占位符也是一种很好的做法。

确保模板参数派生自基类的一种简单方法:

template<typename BarType>
class Foo 
{
    // ...
    ~Foo() { Bar* p = (BarType*)0; }
};

编译器将对赋值进行类型检查,如果Bar不是BarType的明确超类型,则会生成错误,然后优化掉未使用的局部变量。

相关文章: