C++ 可变模板的模板语法问题
我对可变模板有问题:C++ 可变模板的模板语法问题,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,我对可变模板有问题: template <typename T> class A { }; template< template <typename> class T> class B { }; template <template <typename> class T, typename parm> class C { typedef T<parm>
template <typename T> class A { };
template< template <typename> class T> class B { };
template <template <typename> class T, typename parm> class C { typedef T<parm> type; };
template <typename... types> class D { };
template <template <typename...> class T, typename ... parms> class E { typedef T<parms...> type; };
// How to pass list in list??
template < template <typename...> class ...T, ???>
class F
{
};
模板类A{};
模板<模板类T>类B{};
模板类C{typedef T type;};
模板类D{};
模板类E{typedef T type;};
//如何通过列表中的列表??
模板<模板类…T,?>
F类
{
};
首先,将类型传递给模板,没有问题:
A<int> a; //ok
A//好啊
现在,我想从B创建一个实例,但无法传递模板参数:
B<A> b; // ok, but no chance to submit <int> inside A!
B;//好的,但是没有机会在A内提交!
因此,我必须扩展参数列表:
C<A, int> c; // ok, this transport int as parm into A
C;//好的,把int作为parm转换成A
现在我以标准方式使用可变模板:
D<> d1; // ok
D<int, float, double> d2; //ok
D d1;//好啊
D d2//好啊
将参数传递到可变部分也是向前的:
E<D> e1; //ok
E<D, double, float, int> e2; //ok
e1//好啊
E e2//好啊
但是:如果我想要一个列表列表,我找不到任何语法可以让我通过
将参数列表添加到类型列表中。我的意图是这样的。但是上面的例子也显示B代码>是一个错误!因此,以下示例无法工作:-(
F,D,D>F;
我的目标是通过模板专门化来展开列表列表。有什么提示吗
我理解问题后的解决方案。谢谢!
现在,我可以展开可变模板模板,如下面的示例所示。简单的问题是,我等待的是模板类,而不是简单的类型。有时,解决方案非常简单:-)
这就是我现在的工作成果:
template <typename ... > class D;
template <typename Head, typename... types>
class D<Head, types...>
{
public:
static void Do() { cout << "AnyType" << endl; D<types...>::Do(); }
};
template<>
class D<>
{
public:
static void Do() { cout << "End of D" << endl; }
};
template < typename ...T> class H;
template < typename Head, typename ...T>
class H<Head, T...>
{
public:
static void Do()
{
cout << "unroll H" << endl;
cout << "Subtype " << endl;
Head::Do();
H<T...>::Do();
}
};
template <>
class H<>
{
public:
static void Do() { cout << "End of H" << endl; }
};
int main()
{
H< D<int,int,int>, D<float, double, int> >::Do();
return 0;
}
模板类D;
模板
D类
{
公众:
静态void Do(){cout如下所示:
template < template <typename...> class ...T >
class F
{
};
int main()
{
F< D, D > f;
}
template
F类
{
};
int main()
{
FF;
}
所以,F所期望的是一个可变模板类,它接受另一个可变模板类作为它的参数
无法展开模板类参数的参数。如果专门化作为参数传递的模板类,则将获得专门化版本
这:
F< D< int, float>, D< int>, D <float, float, float> > f;
F,D,D>F;
不起作用,因为F需要可变模板类,将可变模板类作为类型,并且D
不再是模板(它是一个具体的类)。您可以通过专业化一次解包一个可变专业化:
template<typename...> struct S;
template<> struct S<> { constexpr static int n = 0; };
template<template<typename...> class T, typename... Us, typename... Vs>
struct S<T<Us...>, Vs...> {
constexpr static int n = sizeof...(Us) + S<Vs...>::n;
};
template<typename...> struct D {};
#include <iostream>
int main() {
std::cout << S<D<int, int, int>, D<int, int>, D<int>>::n << '\n'; // prints 6
}
模板结构;
模板结构S{constexpr static int n=0;};
模板
结构{
constexpr static int n=sizeof…(美国)+S::n;
};
模板结构D{};
#包括
int main(){
std::cout你所描述的与我在B;
中的代码相同。我的问题是关于获取列表列表,这意味着可以扩展参数。使用列表列表真的不可能吗?我不会相信:-)@Klaus你写道:没有机会在A内部提交!
。你可以在A中这样做typedef A type
并在B中将其用作typename A::type
,但不能在可变模板中执行此操作(不能执行此操作:typedef typename…types
)似乎我走的是完全错误的道路,可变模板不是解决方案。有没有其他方法可以获得所需的功能?很容易得到一个列表,可以通过专门化进行扩展。我仍然希望也有一种方法可以通过列表来实现这类事情。任何提示都很好!你能给出吗请给我一个你上次评论的工作示例?@Klaus实际上,评论的最后一部分是垃圾。你需要知道B中的类型,因为它的模板参数是一个模板类。谢谢,你的回答让我大开眼界。我对我的问题给出了最后的解决方案。希望这对其他人有所帮助。
template<typename...> struct S;
template<> struct S<> { constexpr static int n = 0; };
template<template<typename...> class T, typename... Us, typename... Vs>
struct S<T<Us...>, Vs...> {
constexpr static int n = sizeof...(Us) + S<Vs...>::n;
};
template<typename...> struct D {};
#include <iostream>
int main() {
std::cout << S<D<int, int, int>, D<int, int>, D<int>>::n << '\n'; // prints 6
}