gpt4 book ai didi

c++ - 从 C++ 中的类型列表获取类型索引

转载 作者:行者123 更新时间:2023-12-04 01:01:04 26 4
gpt4 key购买 nike

当我尝试使用下面的类型列表获取类型的索引时,代码编译并在使用 else 子句时返回正确的值。但是,当我跳过 else 子句并放置 return getIndex<T, Ts...>(x + 1); 时就在 if 子句结束之后,代码无法编译,因为它继续展开 getIndex<T, Ts...>递归导致如下所示的错误。 gcc 就是这种情况和 clang .这是预期的吗?

#include <type_traits>
template <typename T, typename U, typename ...Ts>
constexpr int getIndex(int x = 0)
{
if constexpr(std::is_same_v<T,U>)
{
return x;
}
else
{
return getIndex<T, Ts...>(x + 1);
}
}

int main()
{
return getIndex<int, float, double, int, char>();
}

将 return 移到 else 之外时出错

getI.cc: In instantiation of ‘int getIndex(int) [with T = int; U = char; Ts = {}]’:
getI.cc:9:32: recursively required from ‘int getIndex(int) [with T = int; U = double; Ts = {int, char}]’
getI.cc:9:32: required from ‘int getIndex(int) [with T = int; U = float; Ts = {double, int, char}]’
getI.cc:14:51: required from here
getI.cc:9:32: error: no matching function for call to ‘getIndex<int>(int)’
9 | return getIndex<T, Ts...>(x + 1);
| ~~~~~~~~~~~~~~~~~~^~~~~~~
getI.cc:3:5: note: candidate: ‘template<class T, class U, class ... Ts> int getIndex(int)’
3 | int getIndex(int x = 0)
| ^~~~~~~~
getI.cc:3:5: note: template argument deduction/substitution failed:
getI.cc:9:32: note: couldn’t deduce template parameter ‘U’
9 | return getIndex<T, Ts...>(x + 1);
| ~~~~~~~~~~~~~~~~~~^~~~~~~

最佳答案

Peter Taran 的回答已经谈到了为什么代码使用 else 编译子句,但他并没有真正谈到编译错误发生的原因或如何修复它。这是您的代码的工作版本:

#include <type_traits>

template <typename T>
constexpr int getIndex(int x = 0)
{
return -1;
}

template <typename T, typename U, typename ...Ts>
constexpr int getIndex(int x = 0)
{
if constexpr (std::is_same_v<T,U>)
{
return x + 1;// NOTE: you have a bug on this line
}
else
{
return getIndex<T, Ts...>(x + 1);
}
}

int main()
{
constexpr int index = getIndex<int, float, double, int, char>();

return 0;
}

不可否认,我没有太多使用可变参数模板,但据我了解,主要问题出在这段编译错误中:

getI.cc:9:32: error: no matching function for call to ‘getIndex<int>(int)’

尽管在递归模板中定义了基本情况,但似乎需要可变参数模板才能完全解包。因此,您需要一个 getIndex<T>已定义,即使在您的示例中未达到代码。添加单个参数 getIndex<T>允许代码编译和运行。

编辑:This post也是相关的,值得一读,也是您问题的另一种可能解决方案。

关于c++ - 从 C++ 中的类型列表获取类型索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68264185/

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