gpt4 book ai didi

c++ - 具有许多基本情况的模板递归

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:25 30 4
gpt4 key购买 nike

目标是通过在位置 START 获取其组件然后跳过每个 INTERVAL 组件,从另一个元组创建一个元组(并提取其类型)。甚至不需要参数包:

template <int NUM_LEFT, int START, int INTERVAL>
struct alternating_tuple_helper {
template <typename TUPLE>
auto operator() (const TUPLE& t) const
-> decltype (std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))) {
return std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t));
}
};

template <int START, int INTERVAL>
struct alternating_tuple_helper<0, START, INTERVAL> { // first base case
template <typename TUPLE>
std::tuple<> operator() (const TUPLE& t) const {return std::tuple<>();}
};

template <int START, int INTERVAL>
struct alternating_tuple_helper<-1, START, INTERVAL> { // second base case
template <typename TUPLE>
std::tuple<> operator() (const TUPLE& t) const {return std::tuple<>();}
};

//...基本情况必须涵盖 0、-1、-2、...一直到 -INTERVAL+1。如何做到这一点?

template <typename TUPLE, int START = 0, int INTERVAL = 2>  // extracting the type
struct alternating_tuple_type {
using type = decltype (alternating_tuple_helper<std::tuple_size<TUPLE>::value - START, START, INTERVAL>()(std::declval<TUPLE>()));
};

template <typename TUPLE, int START = 0, int INTERVAL = 2> // getting the new tuple itself
typename alternating_tuple_type<TUPLE, START, INTERVAL>::type alternating_tuple (const TUPLE& t) {
return alternating_tuple_helper<std::tuple_size<TUPLE>::value - START, START, INTERVAL>()(t);
}

如何处理具有任意值 INTERVAL 的所有基本情况?代码以其他方式工作,并测试了最大 10 的 INTERVAL 大小(是的,目前我正在使用宏来覆盖 0、-1、-2、...、-10,但当然这很糟糕)。

我试过了

template <int NUM_LEFT, int START, int INTERVAL>
struct alternating_tuple_helper {
template <typename TUPLE>
auto operator() (const TUPLE& t) const
-> std::conditional<(NUM_LEFT > 0), decltype (std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))), std::tuple<>> {
return (NUM_LEFT > 0) ? std::tuple_cat (std::make_tuple (std::get<START>(t)), alternating_tuple_helper<NUM_LEFT - INTERVAL, START + INTERVAL, INTERVAL>()(t))
: std::tuple<>();
}
};

但它不会编译,因为它以某种方式与 alternating_tuple_type 冲突(这是为了提取类型)。也许只有那部分需要修复。但我不确定到底是什么问题。

最佳答案

您可以使用此技术创建逻辑测试:

#include <utility>

template<int n, int m, class=void>
struct count{
enum{value=1 +count<n-m, m>::value};
};
template<int n, int m>
struct count<n,m, typename std::enable_if<(n<m)>::type>{
enum{value=0};
};

live example

为了美化模板签名,您可以将 void hack 粘贴到实现细节命名空间中,并将公共(public)接口(interface)转发到那里。

关于c++ - 具有许多基本情况的模板递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224403/

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