gpt4 book ai didi

c++ - 特化一个函数模板

转载 作者:太空宇宙 更新时间:2023-11-04 16:15:58 25 4
gpt4 key购买 nike

如何在 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;
}

关于c++ - 特化一个函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22580491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com