【发布时间】:2021-05-04 17:38:22
【问题描述】:
如何通过索引替换可变参数模板中的 1 种类型? 例如我有:
//-------------static_list-------------
template<class ...Elements>
struct static_list {};
struct execute_command<index, static_list<Commands...>> {
static constexpr int value = execute_s<index + 1, static_list<Commands...>>::value;
}
我想重写它,所以在命令中它会将例如索引 5 处的类型替换为 variable<0, 0> 类型,如下所示:
struct execute_command<false, true, false, false, false, index, static_list<Commands...>> {
static constexpr int value = execute_s<index + 1, static_list_replace<5, variable<0, 0>, Commands...>>::value;
}
我尝试了很多不同的方法,但没有任何效果。例如:
//-------------static_list_replace-------------
template<std::size_t N, typename T, typename Tuple, class IndexSequence>
struct static_list_replace;
template<std::size_t N, typename T, typename Tuple, std::size_t... Idx>
struct static_list_replace<N, T, Tuple, std::index_sequence<Idx ...>> {
using type = std::tuple<std::conditional_t<N == Idx, T, std::tuple_element_t<N, Tuple>>...>;
};
或
namespace detail {
template<std::size_t N, typename T, typename Tuple, std::size_t... Idx>
auto replace(std::index_sequence<Idx...>) ->
std::tuple<std::conditional_t<N == Idx,
T,
std::tuple_element_t<N, Tuple>>...>;
}
template <std::size_t N, typename T, typename... Args>
using Replace = decltype(detail::replace<N, T, std::tuple<Args...>>
(std::index_sequence_for<Args...>{}));
或者我尝试获取列表的开头并在没有一个元素的情况下结束,然后像 static_list<list_beginning<index, Commands...>, element, list_ending<index, Commands...>>> 一样打包它
没有任何效果。
【问题讨论】:
标签: c++ templates variadic-templates template-meta-programming