我正在使用模板化的 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
以便能够传入通用参数,这非常难看。
看起来这应该是一件很常见的事情,但谷歌搜索到目前为止让我失败了(搜索“将模板化对象作为函数参数传递”)
最佳答案
注意
ExampleClass<ParamType1>
和
ExampleClass<ParamType2>
基本上是该语言的两个不同类。
在我看来,你有两种可能性,第一种是:
template<typename ParamType>
int func(ExampleClass<ParamType> obj_param){}
第二种可能性是像这样给 ExampleClass
一个非模板化的公共(public)基类(基本上实现类型删除)
template<typename T>
class ExampleClass : public ExampleClassBase{};
然后将函数重写为
int func(ExampleClassBase& obj_param){}
但由于对象切片问题,在这种情况下您将无法按值传递。
模板函数强制你在头文件中实现函数,如果你想让它尽可能通用,非模板化基类强制你为虚函数调用付费。
编辑:根据 Alan Birtles 的评论,如果您已经知道将实例化 ExampleClass
的所有类型,您可以在 cpp 文件中实现函数的每个版本。
关于c++ - 是否可以定义一个可以将模板化对象作为参数的非模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56968916/