gpt4 book ai didi

c++ - 正确使用 std::enable_if 作为返回类型

转载 作者:太空狗 更新时间:2023-10-29 21:12:30 27 4
gpt4 key购买 nike

我运行 f<5>()并得到如下所示的错误日志:

template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;

template<int N>
Enable_if<(N>0),void> f(){
std::cout << N;
f<N-1>();
}

template<int N>
Enable_if<(N==0),void> f(){
return;
}


In instantiation of 'Enable_if<(N > 0), void> f() [with int N = 1; Enable_if<(N > 0), void> = void]':
13:12: recursively required from 'Enable_if<(N > 0), void> f() [with int N = 3; Enable_if<(N > 0), void> = void]'
13:12: required from 'Enable_if<(N > 0), void> f() [with int N = 4; Enable_if<(N > 0), void> = void]'
25:8: required from here
13:12: error: no matching function for call to 'f()'
13:12: note: candidate is:
11:23: note: template<int N> Enable_if<(N > 0), void> f()
11:23: note: template argument deduction/substitution failed:

下面的代码在 f<5>() 下运行良好并打印 543210:

template<int N>
void f(){
std::cout << N;
f<N-1>();
}

template<>
void f<0>(){
std::cout << 0;
}

摘自 Stroustrup(C++11) 第 845 页。

最佳答案

第一种情况是函数模板重载。当f<1>()被调用,第一个重载将被调用;在里面f<0>()被调用。那时,找不到匹配的函数;第一个重载仅在 N > 0 时实例化,第二个重载是在之后声明的,然后还找不到。

如果您将第二个重载移动到第一个重载之前,代码将起作用。 LIVE

第二种情况是全模板特化的函数模板。对于 f<1>() ,主模板将被调用;在里面f<0>()被调用。然后名称查找仍然会找到主模板本身;然后检查特化 f<0>()将调用特化版本。这意味着如果没有 N == 0 的特化它将导致递归模板实例化。 LIVE

关于c++ - 正确使用 std::enable_if 作为返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47152094/

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