gpt4 book ai didi

c++ - 将模板特化放在一起

转载 作者:行者123 更新时间:2023-11-30 02:26:53 25 4
gpt4 key购买 nike

假设我有以下代码

#include <iostream>

template<int N>
int calcFac() {

return N*calcFac<N-1>();
}

template<>
int calcFac<1> () {

return 1;
}

template<>
int calcFac<0> () {

return 1;
}

int main() {

int f4 = calcFac<4>();
int f5 = calcFac<5>();
int f1 = calcFac<1>();
int f0 = calcFac<0>();

std::cout <<"4! = "<<f4<<std::endl;
std::cout <<"5! = "<<f5<<std::endl;
std::cout <<"1! = "<<f1<<std::endl;
std::cout <<"0! = "<<f0<<std::endl;

return 0;
}

是否有可能(即 STL 是否提供构造)将两个特殊情况混为一谈 calcFac<0>calcFac<1> , 所以我只需要一个函数来处理这两种情况?

即:calcFac</*if this parameter is 0 or 1 use that template function*/>

最佳答案

编辑:我的原始设计有缺陷(不能与 calcFac<0>() 一起正常工作)。我取而代之的是@xaxxon 的设计。保存我的原始设计需要声明三个函数,但它确实将两个特殊情况混为一谈。你可以在这个答案的最后找到它。

有,通过使用 SFINAE 和 std::enable_if_t

#include <type_traits>
template <int N>
std::enable_if_t<N <= 1, int> calcFac() {
return 1;
}

template<int N>
std::enable_if_t<!(N <= 1), int> calcFac() {
return N*calcFac<N-1>();
}

这是如何工作的:

std::enable_if_t<exp, Type>相当于Type如果exptrue ,否则未声明。通过使用 std::enable_if_t这样在返回类型中,将导致 SFINAE exp 时出错是false , 因此该函数不在候选列表中。


#include <type_traits>
template <int N>
std::enable_if_t<N<=1, int> calcFacImpl(int) {
return 1;
}

template <int N>
int calcFacImpl(...) {
return N*calcFacImpl<N-1>(0);
}

template <int N>
int calcFac() {
return calcFacImpl<N>(0);
}

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

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