gpt4 book ai didi

templates - C++11 decltype 和模板循环中的无限递归

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

考虑以下代码:

http://coliru.stacked-crooked.com/a/def9fc0daddcca9f

#include <iostream>
#include <type_traits>

using namespace std;

struct A{
char* ka;
};

struct B{
char* baa;
};

template<typename T0, typename T1>
struct my_pair{
my_pair(T0 el0, T1 el1): el0(el0), el1(el1) {}
T0 el0;
T1 el1; // may be next pair
};

template<typename T, int i, int current = 0>
auto constexpr get_my(const T& t, typename std::enable_if< i==current >::type* = 0) -> decltype(t.el0)
{
return t.el0;
}

template<typename T, int i, int current = 0>
auto constexpr get_my(const T& t, typename std::enable_if< i!=current >::type* = 0) ->
decltype( get_my<T, i, current+1>(t.el1) )
{
return get_my<T, i, current+1>(t.el1);
}


int main()
{
my_pair<int, my_pair<B,double>> p1(12.789, {B(), 3.14} );

auto el1 = get_my<decltype(p1), 1>(p1);
int t =1;
}

在这里,我尝试获取“数组”的第 n 个元素(类似于来自 boost fusion 的可变参数序列)。
当我编译它时,编译器说:

error: template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to increase the maximum) substituting 'template<class T, int i, int current> constexpr decltype (get_my<T, i, (current + 1)>(t.el1)) get_my(const T&, typename std::enable_if<(i != current)>::type*) [with T = my_pair<int, my_pair<B, double> >; int i = 1; int current = 900]'
decltype( get_my<T, i, current+1>(t.el1) )

当 i==current 时,为什么它不调用重载的 get_my?

最佳答案

template<typename T, int i, int current = 0>
auto constexpr get_my(const T& t, typename std::enable_if< i!=current >::type* = 0) ->
decltype( get_my<T, i, current+1>(t.el1) )
{
return get_my<T, i, current+1>(t.el1);
}

调用嵌套的get_my带有错误参数的函数。嵌套调用的类型应为 get_my<decltype(t.el1), i, current+1>(t.el1)而不是get_my<T, i, current+1>(t.el1) .

所以正确的代码应该是:

template<typename T, int i, int current = 0>
auto constexpr get_my(const T& t, typename std::enable_if< i!=current >::type* = 0) ->
decltype( get_my<decltype(t.el1), i, current+1>(t.el1) )
{
return get_my<decltype(t.el1), i, current+1>(t.el1);
}

关于templates - C++11 decltype 和模板循环中的无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23577567/

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