实际上,我发现了类似的问题,但都与函数参数包有关,并通过std::tuple和std::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 变成Container ,我还需要处理最后一个分配器参数,以便在这个新类型中使用一个分配器。有什么想法吗?
当然,这是一种伪码,Container是模板-模板参数。
喂食js std::make_index_sequence<N>或std::index_sequence_for<Ts...> 对
于助手来说,结构或函数通常是对包进行非琐碎操作的最简单方法。
要使用所需的类型转换创建一个帮助器结构,首先使用必要的输入声明它,再加上一个额外的类型参数以接受```js std::index_sequence:
namespace foo_detail { template <template <typename...> class Container, typename NewFirstT, typename NewLastT, typename IdxSeq, typename ... Tail> struct OutContainerHelper; }
然后进行部分专门化,可以使用任何```js
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>...
>;
};
}
那就提供一个js std::make_index_sequence或std::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专门化至少有两个模板参数,因为转换没有意义。如果有人尝试将编译错误与一个只有一个模板参数的模板一起使用,那么编译错误可能会减少一些混乱。)
关于Coliru的工作实例。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。