如何制作一个在模板类上工作的非模板全局函数
How to make a non-template global function that works on a template class?
这个问题可能不清楚,所以让我来解释一个例子。我有一个带有公共函数的模板类PairContainer<T1, T2>
:
//somewhere in PairContainer class definition
void foo(PairContainer& pc)
{
//do something
}
现在我想做一个函数bar
,可以这样调用:
//somewhere in main...
PairContainer<int, int> pc1;
PairContainer<some_class, some_other_class> pc2;
bar(pc1, pc2); //is equivalent to pc1.foo(pc2)
我该怎么做?我做不到:
void bar(PairContainer& pc1, PairContainer& pc2)
{
pc1.foo(pc2);
}
因为这不会编译("缺少模板参数")。
PairContainer
不是类型。这是一个模板。这意味着,它不能在期望类型的地方使用,特别是在函数定义中。您可以创建一个功能栏,接受PairContainer模板的特定实例,如下所示:
void bar(PairContainer<int, int>, PairContainer<some_class, some_other_class>)
但我怀疑这是你想要的。
使bar
接受任何类型的PairContainer
的唯一方法是将其作为模板。
顺便说一句,您之所以可以在类定义中使用void foo(PairContainer& pc)
这样的构造,是因为PairContainer
是一个短手,只意味着PairContainer<T1, T2>
如果您想接受PairContainer
和foo
中的任何模板参数,那么它需要是一个带有pc
参数模板参数的模板函数:
template <typename Y1, typename Y2>
void foo (PairContainer<Y1, Y2>& pc)
{
}
那么bar
需要是具有两个PairContainer
的模板参数的模板函数:
template <typename X1, typename X2, typename Y1, typename Y2>
void bar(PairContainer<X1,X2>& pc1, PairContainer<Y1,Y2>& pc2)
{
pc1.foo(pc2);
}
您必须指定要获取或使用模板的PairContainer
的类型。
您可以将函数的两侧都设置为不同的模板类型
template<typename T, typename U>
void bar(T& pc1, U& pc2)
{
pc1.foo(pc2);
}
但这适用于任何两种类型。要将其限制为两个不同的PairContainer
,则可以使用
template<typename Ty, typename Tu, typename Uy, typename Uu>
void bar(PairContainer<Ty, Tu>& pc1, PairContainer<Uy, Uu>& pc2)
{
pc1.foo(pc2);
}
相关文章:
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中的memset函数工作不正常
- 将返回值存储在函数指针数组的指针中是如何工作的?
- insertElement() 函数无法按预期工作
- 即使没有调用这个递归函数,它是如何工作的?
- type_info成员函数如何工作?
- 如何定义在用作函数参数时工作的类模板的转换
- 优先级队列构造函数的工作
- 有人可以解释一下这个矩阵幂函数是如何工作的吗?
- 使用移动和复制语义时函数匹配如何工作?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++代码停止工作错误使用cout内部函数
- 好友函数的工作原理
- 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 递归函数调用在后台工作
- 如何使函数在派生类中工作?
- 在下面的代码中,虚函数是如何工作的
- 工作函数重载如何使用可变参数解析?
- C++继承和具有虚拟工作函数的Pthreads