参数值相等时的模板专门化

Template specialization when parameter values are equal

本文关键字:专门化 参数      更新时间:2023-10-16

我有一个形式为

的函数
template<int a, int b>
void f();

当a == b时,我想专门化。伪代码看起来像:

template<int a>
void f<a, a>(){ //something}
template<int a, int b>
void f<a, b>(){ //something different}

这是否可能没有部分模板特化问题?

编辑:谢谢你的快速回复。这个方法实际上是在一个类的内部,更像这样:
<typename a> class A{ 
    template<int b, int c> f(); 
}; 
A inst; 
inst.f<1,1>(); 
inst.f<1,2>(); 

不能部分专门化函数模板,但可以部分专门化类模板。

这为下面的技巧留下了空间,其中实际的工作是由主函数模板和专门化函数模板的静态成员函数完成的,您的原始f()函数将其职责委托给它们:

#include <iostream>
namespace detail
{
    template<int A, int B>
    struct helper
    {
        static void call() { std::cout << "f<A, B>()" << std::endl; }
    };
    template<int A>
    struct helper<A, A>
    {
        static void call() { std::cout << "f<A, A>()" << std::endl; }
    };
}
template<int a, int b>
void f()
{
    detail::helper<a, b>::call();
}
以下是f()函数模板的使用方法:
int main()
{
    f<1, 2>();
    f<1, 1>();
}

下面是一个的实例

编辑:

如果你的函数模板是一个成员函数,事情会稍微复杂一些,但是上面列出的将函数模板部分特化变成类模板部分特化的解决方案仍然是可行的。

这是基于注释中提供的示例的操作方法。

首先,前向声明helper类模板,并授予它的实例访问你的类模板A的私有成员的权利(附加类型参数T的作用将在一会儿变得清晰):

namespace detail
{
    template<typename T, int A, int B>
    struct helper;
}
template <typename a>
class A
{
public:
    template<int b, int c>
    void f();
private:
    template<typename, int, int> friend struct detail::helper;
};

然后像前面那样定义helper类模板和它的专门化,但是向call()函数添加一个函数形参,该函数的类型必须用于操作调用原始成员函数f()的类对象:

namespace detail
{
    template<typename T, int A, int B>
    struct helper
    {
        static void call(T* p) { std::cout << "f<A, B>()" << std::endl; }
    };
    template<typename T, int A>
    struct helper<T, A, A>
    {
        static void call(T* p) { std::cout << "f<A, A>()" << std::endl; }
    };
}
然后可以定义成员函数f(),如下所示:
template<typename a>
template<int b, int c>
void A<a>::f()
{
    detail::helper<A<a>, b, c>::call(this);
}

并最终这样使用:

int main()
{
    A<int> inst;
    inst.f<1,1>();
    inst.f<1,2>();
}

这些都放在这个实例中