C++模板:如果我们把错误的东西放在模板类中会发生什么
C++ Template: What happens if we put wrong thing in our template class
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
的明确超类型,则会生成错误,然后优化掉未使用的局部变量。
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- C++如果必须在编译时确定大小,std::array 有什么意义?
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如果我在 const 函数上使用指针,我可以返回什么?
- 基本的 c++ 问题:如果我在函数中创建某些内容并返回它会发生什么?
- 如果我在字符数组上使用 close() 会发生什么?
- 如果在双引号末尾传递逗号(,),"cout"的行为是什么?
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 如果与memory_order_acquire一起存储会发生什么
- 如果我们不从 std::qsort 返回 0 会发生什么?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 这个问题叫什么?如果通过基类型传递结构,则后代类型中的字段在方法中不可用
- {1, 2} 是值吗?如果是,它的类型是什么?如果不是,为什么可以将其分配给初始值设定项列表
- 什么'如果pthread_cond_wait自己这样做,那么锁定和解锁互斥锁的意义就在于什么
- 这个宏语句是合法的C++还是其他什么?如果它是合法的,它是如何运作的