传递指定最左侧模板参数的模板模板参数(无别名)

passing template template argument that is specified left-most template parameter (without alias)

如何指定模板模板参数最左边的模板参数?

例子

B<int,T2> 是一个带有 2 个参数的模板 class。
E<H> 是一个 class 接收 "template template argument" H<T2>.
我想将 B 传递到 E<H> 的插槽 H 中,例如:E<B<1>>E<B<2>>E<B<42>>

但是,我只发现不好的解决方法,例如别名 B1<T>=B<1,T> 然后将 B1 传递到 H-槽 :-

class D{};                                  //a library class
template<template<class T2>class H>class E{ //a library, don't modify me
    //"H<T2>" is "B1<T2>" = "B<1,T2>"
    H<D> h;  //Here, T2=D, so "H<D>" = "B<1,D>"
};
template<int n,class T2> class B{};     //a user class
template<class T2> using B1 = B<1,T2>;  //a user class
int main() {
    E<B1> e;         //I prefer to call it like E<B<1>>. (main objective)
    //const int n=5;
    //E<B<n>> en;    //If it is possible, it would be nice. (side objective)
    return 0;
}

它有效(ideone demo),但我必须为我想要的别名,例如B1<T>,B2<T> .... B42<T>.
这种做法不是那么可爱。有没有更优雅的方式?

我知道 Macro 或 X-Macro 是一个可能的解决方案,但我尽量避免它。

不能写模板别名别名。 B<1> 本身不能作为模板,这意味着您可以编写类似 B<1><int> 的内容。诚然,这有时会有用。但是您可以只命名该中间模板:

template <int N>
struct X {
    template <class T>
    using apply = B<N,T>;
};

E<X<1>::apply> e;

虽然不相当E<X<1>>,但比写B1B2、...