如何制作一个在模板类上工作的非模板全局函数

How to make a non-template global function that works on a template class?

本文关键字:工作 函数 全局 何制作 一个      更新时间:2023-10-16

这个问题可能不清楚,所以让我来解释一个例子。我有一个带有公共函数的模板类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>

如果您想接受PairContainerfoo中的任何模板参数,那么它需要是一个带有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);
}