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

时间:2017-05-10 13:58:24

标签: c++ templates c++14 template-templates

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

实施例

B<int,T2>是一个带有2个参数的模板类 E<H>是一个接收“模板模板参数”H<T2>的类 我想将B传递到H的{​​{1}}个广告位,例如:E<H>E<B<1>>E<B<2>>等。

但是,我发现只有糟糕的工作,例如别名E<B<42>>然后将B1<T>=B<1,T>传递到B1 - 广告位: -

H

它有效(ideone demo),但我必须将我想要的那些别名,例如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; } B1<T> .... B2<T>
这种方法并不那么可爱。有更优雅的方式吗?

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

1 个答案:

答案 0 :(得分:5)

您无法编写模板别名别名。 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,...

要好得多