对于C ++模板,有没有办法找到“有效”输入的类型?

时间:2013-03-13 19:59:36

标签: c++ templates

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

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

  typename InputType::SubType1::SubType2 &a;

  //Do something

}

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

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

2 个答案:

答案 0 :(得分:2)

  

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

首先,因为那些重载将具有完全相同的主体或非常相似的主体。如果功能的主体足够长,则有更多版本的功能是维护的问题。当你需要改变算法时,你现在必须做N次,并希望你不会犯错误。大多数时候,冗余都很糟糕。

此外,即使现在,也可能只有少数这样的类型满足你的函数的语法要求,将来可能会有更多。使用函数模板可以让您的算法使用新类型,而无需在每次引入新类型时都编写新的重载。

答案 1 :(得分:0)

使用泛型类型的优势不在于模板端:如果您愿意每次都明确命名它们并编辑模板代码,那么它就是一样的。

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

换句话说,如果您事先知道所有类型都已知,那么您将排除代码修改和扩展,这是使用模板的一半。