C++ 的替代方案不允许模板化类型别名?

问题描述 投票:0回答:1

想象一个库有模板化类

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
会做同样的事情并以同样的方式工作。

c++ using type-deduction partial-specialization template-templates
1个回答
0
投票

您将类似

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>
© www.soinside.com 2019 - 2024. All rights reserved.