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

标签 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 以便能够传入通用参数,这非常难看。

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

最佳答案

注意

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/

相关文章:

c++ - 如何在编译时判断一个类型是否派生自模板类?

templates - 在vuejs中分离模板,使用webpack

c++ - 使用 fstream 库并在屏幕上打印时出现文件问题?

c++ - 自适应正交 (C++)

c++ - QSignalSpy 等待和两个信号

C++模板类T麻烦

c++ - 让编译器最终选择使用哪种类型

c++ - 作者所说的不良结果是什么?

c++ - Windows 应用商店应用中的 native NuGet 包

templates - 戈朗 : What's the pre-requisite to use {{ template "partial.html" . }}