0

我有一个库,模板类/函数经常访问输入类型的显式成员,如下所示:

template <
typename InputType>
bool IsSomethingTrue(
  InputType arg1) {

  typename InputType::SubType1::SubType2 &a;

  //Do something

}

在这里,SubType1andSubType2本身就是用于实例化的泛型类型InputType。有没有办法快速找到库中所有可以传入的类型InputType(同样是 forSubType1SubType2)?到目前为止,我只是在整个代码库中搜索包含适当成员的类,但是模板输入名称在很多地方被重用,因此非常麻烦。

从编码的角度来看,当只有有限的一组可能已经定义的有效输入类型时,使用这样的模板有什么意义?为什么不直接用显式类型重载这个函数而不是让它们泛型呢?

4

2 回答 2

2

从编码的角度来看,当只有有限的一组可能已经定义的有效输入类型时,使用这样的模板有什么意义?为什么不直接用显式类型重载这个函数而不是让它们泛型呢?

首先,因为这些重载将具有完全相同的主体,或者非常相似的主体。如果函数的主体足够长,拥有更多的版本是维护的问题。当您需要更改算法时,您现在必须进行 N 次,希望您不会出错。大多数时候,冗余是不好的。

此外,即使现在可能只有少数这样的类型可以满足您函数的语法要求,但将来可能会更多。拥有一个函数模板可以让您的算法与新类型一起工作,而无需在每次引入一种新的此类类型时编写新的重载。

于 2013-03-13T20:04:50.593 回答
0

使用泛型类型的好处不在于模板端:如果您愿意显式命名它们并每次都编辑模板代码,那是一样的。

但是,当您引入模板接受的类型的子类或变体时会发生什么?另一端无需修改。

换句话说,当你说所有类型都是预先知道的时,你是在排除代码修改和扩展,这是使用模板的一半。

于 2013-03-13T20:04:38.547 回答