可变模板的模板语法问题
template template syntax problems with 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> 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<int> a; //ok
现在,我想从B创建一个实例,但无法传递模板模板param:
B<A> b; // ok, but no chance to submit <int> inside A!
所以我必须扩展参数列表:
C<A, int> c; // ok, this transport int as parm into A
现在我以标准的方式使用可变模板:
D<> d1; // ok
D<int, float, double> d2; //ok
将参数传递到可变部分也是向前的:
E<D> e1; //ok
E<D, double, float, int> e2; //ok
但是:如果我想有一个列表列表,我找不到可以通过的语法参数列表添加到类型列表。我的意图是这样的。而且上面的例子表明CCD_ 1是一个错误!因此以下示例无法工作:-(
F< D< int, float>, D< int>, D <float, float, float> > 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;
}
您可以通过专业化一次打开一个不同的专业化:
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
}
像这样:
template < template <typename...> class ...T >
class F
{
};
int main()
{
F< D, D > f;
}
所以,F所期望的是一个变参数模板类,它以另一个变变量模板类为参数。
不能展开模板类参数的参数的参数。如果您专门化作为参数传递的模板类,那么您将获得专门化的版本。
此:
F< D< int, float>, D< int>, D <float, float, float> > f;
不起作用,因为F期望可变模板类,将可变模板类作为类型,并且D< int, float>
不再是模板(它是一个具体的类)。
相关文章:
- C++:取消引用十六进制值,有点语法问题
- Qt的新信号/时隙语法问题 - 连接到一个简单的函数
- 语法问题:"char [5] const &"是什么意思?
- 掌握C++ std::function 语法的问题
- 精神语法解析问题
- 关于异常继承中的语法的问题
- C++ std::函数语法问题
- C++.传递给函数.语法问题
- 内联访问说明符出现语法问题
- 无法在语法问题中返回简单函数
- Windows / Intel Compiler / Inline Assembler & GNU 语法问题
- 等级课程语法问题
- 关于结构初始化语法复杂性的问题
- 可变模板的模板语法问题
- 构造函数主体中的简单指针语法出现问题
- 扩展现有的 Spirit 语法(AST 和 skipper 的问题)
- 使用自定义对象的地图使用MAP?可能是语法问题
- 语法问题
- GLSL语法问题:意外的new_identifier
- 此C 异常语法有什么问题(std :: runtime_error)