如何在 C++ 中特化函数模板?
#include <iostream>
template <int X = 0> //Wrong attempt, does not compile.
int func(int y)
{
return X + y;
}
template<int X>
int func(int y)
{
return X + func<X-1>(y);
}
int main()
{
std::cout << func<1>(2);
return 0;
}
我希望这个程序的结果是:1 + 0 + y = 3。
对于 y = 2,它将是:2 + 1 + 0 + y。
我知道有更好的方法来进行这种计算,我正在尝试理解这方面的语言。
通过委托(delegate)重载函数
template <int X>
class Int
{
};
template <int X>
int funcSwitch(int y, Int<X>)
{
return X + funcSwitch(y, Int<X-1>());
}
int funcSwitch(int y, Int<0>)
{
return y;
}
template<int X>
int func(int y)
{
return funcSwitch(y, Int<X>());
}
int main()
{
std::cout << func<1>(2);
return 0;
}
您需要注意不要在 funcSwitch
之外的另一个命名空间中定义 Int
,因为这样在第一个 funcSwitch
中的调用将找不到实例化时的第二个 funcSwitch
情况(这是因为称为 ADL 的规则)。为了不考虑这个,你也可以写一个类模板委托(delegate)给
template<int X>
struct FuncImpl {
int operator()(int y) const {
return X + FuncImpl<X-1>()(y);
}
};
template<>
struct FuncImpl<0> {
int operator()(int y) const {
return y;
}
};
template<int X>
int func(int y)
{
return FuncImpl<X>()(y);
}
int main()
{
std::cout << func<1>(2);
return 0;
}
一般来说,我更喜欢没有类的技术,因为如果 func
是成员函数,它允许成员函数仍然访问 *this
及其私有(private)成员。
为了完整起见,函数也有“显式特化”,但由于它的局限性和陷阱,我不推荐它。在这种情况下,它将起作用并且将是
template<int X>
int func(int y)
{
return X + func<X-1>(y);
}
template <>
int func<0>(int y)
{
return y;
}
int main()
{
std::cout << func<1>(2);
return 0;
}
我是一名优秀的程序员,十分优秀!