我有一个库,其中模板类/函数经常访问输入类型的显式成员,如下所示:
template <
typename InputType>
bool IsSomethingTrue(
InputType arg1) {
typename InputType::SubType1::SubType2 &a;
//Do something
}
此处,SubType1
和SubType2
本身就是用于实例化InputType
的通用类型。有没有办法快速找到库中有效传入InputType
的所有类型(同样适用于SubType1
和SubType2
)?到目前为止,我刚刚在整个代码库中搜索包含相应成员的类,但模板输入名称在很多地方都被重用,因此非常麻烦。
从编码的角度来看,当只有一组有限的有效输入类型可能已被定义时,使用这样的模板是什么意思?为什么不用显式类型重载此函数而不是使它们通用?
答案 0 :(得分:2)
从编码的角度来看,当只有一组有限的有效输入类型可能已被定义时,使用这样的模板是什么意思?为什么不用显式类型重载此函数而不是使它们通用?
首先,因为那些重载将具有完全相同的主体或非常相似的主体。如果功能的主体足够长,则有更多版本的功能是维护的问题。当你需要改变算法时,你现在必须做N次,并希望你不会犯错误。大多数时候,冗余都很糟糕。
此外,即使现在,也可能只有少数这样的类型满足你的函数的语法要求,将来可能会有更多。使用函数模板可以让您的算法使用新类型,而无需在每次引入新类型时都编写新的重载。
答案 1 :(得分:0)
使用泛型类型的优势不在于模板端:如果您愿意每次都明确命名它们并编辑模板代码,那么它就是一样的。
但是,当您引入模板接受的类型的子类或变体时会发生什么?另一方面无需修改。
换句话说,如果您事先知道所有类型都已知,那么您将排除代码修改和扩展,这是使用模板的一半。