是否可以定义一个非模板函数,该函数可以将模板对象作为参数

时间:2019-07-10 10:38:02

标签: c++ templates

我正在使用模板化的C ++类。

我实例化了此类的两个不同的模板版本:

ExampleClass<ParamType1> obj1;
ExampleClass<ParamType2> obj2;

所以我有两个对象,它们是同一类,但是模板参数不同。

我现在希望能够定义一个可以将obj1或obj2作为参数的函数(极其简化的示例!)

int func(ExampleClassXXX obj_param)
{
  return obj_param.member_operation();
}

这样我就可以打电话给func(obj1)func(obj2

这是否可行?如果可以,函数定义中指定obj_param参数所需的语法是“使用任何模板参数创建的ExampleClass实例”?

this question的回答涵盖了更一般的情况-使“ obj_param”为任何类型。该答案的文本中缺少大多数细节,只有当您单击“实时演示”时,您才能看到它们正在实例化模板化的struct以便能够传递通用参数,即很丑。

这似乎应该是一件很平常的事情,但是到目前为止,谷歌搜索使我失败了(搜索“将模板对象作为函数参数传递”)

2 个答案:

答案 0 :(得分:4)

请注意

ExampleClass<ParamType1>

ExampleClass<ParamType1>

基本上是该语言的两个不同的类。

在我看来,您有两种可能:

template<typename ParamType>
int func(ExampleClass<ParamType> obj_param){}

第二种可能性是给ExampleClass这样的非模板公共基类(基本上实现类型擦除)

 template<typename T>
 class ExampleClass : public ExampleClassBase{};

然后将函数重写为

int func(ExampleClassBase& obj_param){}

但由于对象切片问题,在这种情况下您将无法按值传递。

如果希望保持其通用性,则模板函数会强制您在头文件中实现该功能,非模板基类会强制您为虚拟函数调用付费。

编辑:根据Alan Birtles的评论,如果您已经知道将实例化ExampleClass的所有类型,则可以在cpp文件中实现函数的每个版本。

答案 1 :(得分:2)

  

所以我有两个对象,它们是同一类,但是模板参数不同。

那里是一个矛盾。如果参数不同,则该类不是同一类。模板不是类,而是模子。如果将两种不同的金属倒入其中,尽管形状相似,也会得到两个截然不同的物体。它们的质量和密度不同,电磁特性也可能不同,依此类推。有点切线,但是将模板与模板产生的东西区分开来很重要,因为模板和模板不一样。

这就是为什么将相同模板产生的不同专业视为不同的类。它们在类型系统下不相关,因此没有函数可以自动将它们视为同一对象。您可以创建一个功能模板,并使用它来为每个不同的专业生成功能,但是那些模板也将是不同的功能。

如果您具有所有专业通用的部分,则可以将其重构为基类(适当的类,而不是类模板),并具有接受 that 的函数。

>