gpt4 book ai didi

c++ - 更改可变参数模板中的最后一个类型

转载 作者:行者123 更新时间:2023-12-02 10:22:42 24 4
gpt4 key购买 nike

我实际上发现了类似的问题,但是所有问题都与函数参数包有关,并通过std::tuplestd::index_sequence处理它们。我需要其他东西,但我自己无法建立连接。这里是:

假设我有一个函数带有一些可变参数包,并且我想实现:

template <typename NewVal, template Container, typename T, typename... Ts>
auto foo(Container<T, Ts...> t, NewVal const& v) {
using OutContainer= Container<NewVal, Same as Ts up to last Type..., but LastElement should be different>
OutContainer o;
// fill this new container with v
return o;
}

我观察到,在STL中,容器中的 Allocator模板参数始终是最后一个,存储的类型始终是第一个(现在不介意 std::map)。因此,如果我想将 Container<T>变成 Container<U>,那么我也需要处理最后一个分配器参数,以便为这种新类型使用分配器。有任何想法吗?

当然,这是一种伪代码, Container是模板-模板参数。

最佳答案

std::make_index_sequence<N>std::index_sequence_for<Ts...>馈给辅助结构或函数通常是对包进行简单操作的最简单方法。

要使用所需的类型转换创建辅助结构,请首先使用必要的输入对其进行声明,再加上一个额外的类型参数以采用std::index_sequence:

namespace foo_detail
{
template <template <typename...> class Container,
typename NewFirstT,
typename NewLastT,
typename IdxSeq,
typename ... Tail>
struct OutContainerHelper;
}

然后进行部分特化处理,可以采用任何 std::index_sequence<I...>:
namespace foo_detail
{
template <template <typename...> class Container,
typename NewFirstT,
typename NewLastT,
std::size_t ... I,
typename ... Tail>
struct OutContainerHelper<
Container, NewFirstT, NewLastT, std::index_sequence<I...>, Tail...>
{
using type = Container<
NewFirstT,
std::conditional_t<(I+1 == sizeof...(Tail)), NewLastT, Tail>...
>;
};
}

然后只需提供 std::make_index_sequencestd::index_sequence_for作为帮助程序的模板参数即可:
template <template <typename...> class Container,
typename OldFirstT,
typename T2,
typename... Ts,
typename NewVal>
auto foo(Container<OldFirstT, T2, Ts...> t, NewVal const& v) {
using NewLastT = ???;
using OutContainer = typename foo_detail::OutContainerHelper<
Container, NewVal, NewLastT,
std::index_sequence_for<T2, Ts...>, T2, Ts...
>::type;
OutContainer o;
// fill this new container with v
return o;
}

(附加的 T2确保 Container专门化至少具有两个模板参数,因为否则转换就没有意义了。如果有人尝试将其与仅具有一个模板参数的模板一起使用,这可能会使编译错误的困惑程度降低)

Working example on coliru.

关于c++ - 更改可变参数模板中的最后一个类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59401328/

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