传递指定最左侧模板参数的模板模板参数(无别名)
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>>
,但比写B1
、B2
、...
如何指定模板模板参数最左边的模板参数?
例子
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>>
,但比写B1
、B2
、...