gpt4 book ai didi

c++ - enable_if 模板函数的关键顺序

转载 作者:行者123 更新时间:2023-11-30 01:49:38 28 4
gpt4 key购买 nike

为什么编译器对 std::tuple 的访问者具有以下定义顺序很重要

namespace TupleVisit{

//This function SHOULD BE DEFINED SECONDLY;
//IN THIS CONFIGURATION COMPILER DOES NOT
//SEE THE BELOW RECURSTION TERMINATION ???
template<std::size_t Idx = 0,
typename Visitor,
typename... T,
typename std::enable_if< Idx < sizeof...(T) , void *>::type = nullptr
>
static
void visit(Visitor && v, std::tuple<T...> & t){
v( std::get<Idx>(t) );
TupleVisit::visit<Idx+1, Visitor, T... >(std::forward<Visitor>(v),t);
}


template<std::size_t Idx = 0,
typename Visitor,
typename... T,
typename std::enable_if< Idx == sizeof...(T) , void *>::type = nullptr
>
static void
visit(Visitor && v, std::tuple<T...> & t){}
}

实例:Code

我认为多个 enable_if 开关的一般规则应该是对所有函数进行原型(prototype)设计,然后按任意顺序定义它们?这会导致 SFINAE 始终看到正确的可用函数吗?

最佳答案

为什么它会看到下面声明的 visit

template 函数不是宏——函数查找是在编写模板时完成的,加上从调用模板的上下文中进行的 ADL 查找.

由于无法通过 ADL 找到第二次访问,因此在第一次访问中的调用点不可见。

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

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