我正在使用模板化的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
以便能够传递通用参数,即很丑。
这似乎应该是一件很平常的事情,但是到目前为止,谷歌搜索使我失败了(搜索“将模板对象作为函数参数传递”)
答案 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 的函数。
>