Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以定义一个可以将模板化对象作为参数的非模板函数 我使用的是C++类,它是模板化的。_C++_Templates - Fatal编程技术网

是否可以定义一个可以将模板化对象作为参数的非模板函数 我使用的是C++类,它是模板化的。

是否可以定义一个可以将模板化对象作为参数的非模板函数 我使用的是C++类,它是模板化的。,c++,templates,C++,Templates,我实例化了该类的两个不同模板版本: ExampleClass<ParamType1> obj1; ExampleClass<ParamType2> obj2; 这样我就可以调用func(obj1)或func(obj2) 这是可能的吗?如果是,函数定义需要什么语法来指定obj_param参数是“使用任何模板参数创建的ExampleClass实例” 这类问题的答案涵盖了一个更一般的情况,即“obj_param”可以是任何类型。答案文本中缺少大部分细节,只有当你点击“live

我实例化了该类的两个不同模板版本:

ExampleClass<ParamType1> obj1;
ExampleClass<ParamType2> obj2;
这样我就可以调用
func(obj1)
func(obj2

这是可能的吗?如果是,函数定义需要什么语法来指定
obj_param
参数是“使用任何模板参数创建的ExampleClass实例”

这类问题的答案涵盖了一个更一般的情况,即“obj_param”可以是任何类型。答案文本中缺少大部分细节,只有当你点击“live demo”时才会出现您可以看到,他们正在实例化一个模板化的
struct
,以便能够传入泛型参数,这非常难看

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

注意

ExampleClass<ParamType1>
然后将函数重新编写为

int func(ExampleClassBase& obj_param){}
但在这种情况下,由于对象切片问题,您将无法传递值

模板函数强制您在头文件中实现该函数。如果您希望使其尽可能通用,则非模板基类强制您为虚拟函数调用付费

编辑:根据Alan Birtles的评论,如果您已经知道将实例化的所有类型
ExampleClass
,您可以在cpp文件中实现函数的每个版本

因此,我有两个对象,它们是相同的类,但具有不同的模板参数

矛盾就在这里。如果参数不同,这不是同一个类。模板不是类,它是一个模具。如果你把两种不同的金属倒入其中,你会得到两个非常不同的物体,尽管形状相似。它们有不同的质量和密度,可能有不同的电磁特性,等等。有点晒黑gential,但重要的是要区分模板和它产生的东西,它们是不同的

这就是为什么从同一模板生成的不同专门化被视为不同的类。它们在类型系统下不相关,因此没有函数可以自动将它们视为同一事物。您可以创建函数模板,并使用它为每个不同的专门化生成函数,但这些也是dif不同的功能


如果您有一个对所有专门化都通用的部分,您可以将其重构为基类(适当的类,而不是类模板),并拥有一个接受该类的函数。

“因此,我有两个对象,它们是相同的类,但具有不同的模板参数。”-
obj1
obj2
是不同的、不相关的类的对象。
func
也需要是一个模板,就像
template int func(ExampleClass obj_param)
将函数设置为模板函数,或者声明一个基类并将其作为参数
ExampleClass
是模板,
ExampleClass
是类。虽然是真的,但你的答案并不能真正回答OP的问题。我理解OP有矛盾,但根本问题是清楚的。@Neijwiert-可以发誓最后我写了一些关于公共基类的内容。“模板化函数迫使您在头文件中实现该函数”不一定,您可以在cpp文件中为每个类提供实现,只需在header@AlanBirtles我不确定是否要将其添加到描述中,这是一个很好的观点,但我觉得可能有太多的信息。我会更新答案。
ExampleClass<ParamType2>
template<typename ParamType>
int func(ExampleClass<ParamType> obj_param){}
 template<typename T>
 class ExampleClass : public ExampleClassBase{};
int func(ExampleClassBase& obj_param){}