模板:如何将非类型参数对象作为非类型参数传递给另一个模板

时间:2016-02-05 21:49:51

标签: c++ templates non-type

为了避免在8位系统上传递给许多常量但仍然保持代码模块化,我使用模板和接收这些常量的非类型(引用)参数。只要我只传递参数对象"一个级别"深。

如果我尝试将这样的模板化对象用作另一个模板的非类型参数,编译器甚至会拒绝我的尝试来声明这样的模板:

struct Params {constexpr Params(int i){}};
extern constexpr Params const p(1);

// This compiles fine
template <Params const &p> class A { };
A<p> a;

// This does not compile
template <A<Params const &> &a> class B { };
B<a> b;

所以我的问题是:有人知道如何定义一个接收另一个(非类型)模板的对象作为参数的模板吗?

1 个答案:

答案 0 :(得分:0)

您将A定义为具有非类型参数p(类型为Params const&)的模板,但是在B的定义中您传递的是键入到模板A(即类型Params const&)。你正在对A进行处理,就好像它有一个类型参数,即使它没有。

但这很好用:

template <A<p> &a> class B { };
B<a> b;

如果您希望B任何 A<P>接受P类型的参数,那么您需要P的额外模板参数

template <Params const& P, A<P> &a> class B { };
B<p, a> b;