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

Mic*_*rth 2 c++ templates

我正在使用模板化的 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以便能够传入通用参数,这非常难看。

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

Cur*_*hts 5

注意

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 文件中实现该函数的每个版本。