想象一个库有模板化类
A
和 B
:
template <template <class> class T> class A;
template <class T, class U> class B;
现在,如果库的用户想要将 B 作为 A 的参数传递,他/她可以这样做:
template <class T>
using C = B<T, UserType>;
A<C> a{};
但是,
B
实际上可能有更多的模板和模板模板参数,这会使用户端变得非常丑陋:每次用户想要使用不同类型的A
时,他/她都必须这样做那个巨大的类型别名,然后为每个不同的类型使用不同的名称。这显然不是一个选择。
因此,此类库的实现者是否可以允许用户执行以下操作:
A<D<UserType>> a{};
其中
D
将被“推导”为 template <class T> B<T, UserType>
。
从概念上讲,实施者应该这样做:
template <class UserType>
using D = template <class T> B<T, UserType>;
然后
D
可以作为模板参数传递给 A
作为 A<D<UserType>>
。然而,正如here提到的,这不能编译。
实施者是否有办法允许用户同时执行
A<C>
和A<[B, UserType]>
,其中括号表示在库端实现的B
和UserType
的某些操作?显然,实施者可以使用不同的名称,例如 A1
和 A2
,但他们不想这样做,因为 A1
和 A2
会做同样的事情并以同样的方式工作。
您将类似
D<UserType>
的内容描述为模板本身,其中 D<UserType><T>
(虚构语法)是 B<T, UserType>
。
这是不可能的,但你可以通过拥有会员模板来接近,
D<UserType>::member<T>
template<template<class...> class Template, class... U>
struct template_bind_back {
template<typename... T>
using type = Template<T..., U...>;
};
A<template_bind_back<B, UserType>::type>