我正在使用模板化的 C++ 类。
我实例化了这个类的两个不同的模板版本:
ExampleClass<ParamType1> obj1;
ExampleClass<ParamType2> obj2;
Run Code Online (Sandbox Code Playgroud)
所以我有两个对象是同一个类,但具有不同的模板参数。
我现在希望能够定义一个可以将 obj1 或 obj2 作为参数的函数(极其简化的示例!):
int func(ExampleClassXXX obj_param)
{
return obj_param.member_operation();
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以调用func(obj1)或func(obj2。
这是可能的,如果是,函数定义指定obj_param参数所需的语法是“使用任何模板参数创建的 ExampleClass 的实例”?
这个问题的答案涵盖了更一般的一步的情况——“obj_param”是任何类型。该答案的文本中缺少大部分细节,只有当您单击“实时演示”时,您才会看到它们正在实例化模板struct以便能够传入通用参数,这非常难看。
看起来这应该是一件很常见的事情,但是到目前为止,谷歌搜索让我失败了(搜索“将模板化对象作为函数参数传递”)
注意
ExampleClass<ParamType1>
Run Code Online (Sandbox Code Playgroud)
和
ExampleClass<ParamType2>
Run Code Online (Sandbox Code Playgroud)
基本上是该语言的两个不同类。
在我看来,您有两种可能性,第一种是:
template<typename ParamType>
int func(ExampleClass<ParamType> obj_param){}
Run Code Online (Sandbox Code Playgroud)
第二种可能性是给ExampleClass一个非模板化的公共基类(基本上实现类型擦除)像这样
template<typename T>
class ExampleClass : public ExampleClassBase{};
Run Code Online (Sandbox Code Playgroud)
然后将函数重写为
int func(ExampleClassBase& obj_param){}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,由于对象切片问题,您将无法按值传递。
模板函数强制您在头文件中实现该函数,如果您想使其尽可能通用,非模板化基类强制您为虚函数调用付费。
编辑:根据 Alan Birtles 的评论,如果您已经知道要实例化的所有类型,则ExampleClass可以在 cpp 文件中实现该函数的每个版本。