【问题标题】:C++11 : Is it possible to give fixed-template-parameted template to varidic-template-template-parameter?C++11:是否可以将固定模板参数模板提供给可变参数模板模板参数?
【发布时间】:2014-09-26 12:58:11
【问题描述】:

(是的,标题很奇怪,感谢我的可怜英语;希望有人能改进它。)

回复this question,发现这段代码有效:

template <typename T1, typename T2> class A { };
template <template <typename...> class U> class B { };

int main()
{
    B<A> it_works;
}

..虽然template &lt;typename...&gt; classtemplate &lt;typename, typename&gt; class 不相等。

我试图弄清楚为什么它是可能的,并观看 N3337 standard 的 [temp.param],但我找不到任何东西。怎么可能?

【问题讨论】:

  • 同样的原因,你可以先做template&lt;typename... Ts&gt; void foo();,然后再做foo&lt;int&gt;();,或者foo&lt;char, double&gt;();,或者任何你想要的。如果您正在寻找标准文本,Variadic Templates 下的很多内容:模板参数包是接受零个或多个模板参数的模板参数
  • 哦,你的评论其实就是一个答案>o
  • @ikh:是的,现在这是一个正确的答案。

标签: c++ templates c++11 language-lawyer


【解决方案1】:

是的,可以这样做。 C++ 11 14.3.3/3 明确允许它,并提供了一个例子。

3 一个 template-argument 匹配一个模板 template-parameter(称它为P)当每个模板参数 在 template-argument 对应的类模板或别名模板的 template-parameter-list 中(调用 它A) 匹配Ptemplate-parameter-list 中的相应模板参数。 Ptemplate-parameter-list包含模板参数包(14.5.3)时,模板参数包会匹配零 Atemplate-parameter-list 中的一个或多个模板参数或模板参数包 与P中的模板参数包相同的类型和形式(忽略那些模板参数是否是 模板参数包) [ 示例:

template <class T> struct eval;

template <template <class, class...> class TT, class T1, class... Rest>
struct eval<TT<T1, Rest...>> { };

template <class T1> struct A;
template <class T1, class T2> struct B;
template <int N> struct C;
template <class T1, int N> struct D;
template <class T1, class T2, int N = 17> struct E;

eval<A<int>> eA; // OK: matches partial specialization of eval
eval<B<int, float>> eB; // OK: matches partial specialization of eval
eval<C<17>> eC; // error: C does not match TT in partial specialization
eval<D<int, 17>> eD; // error: D does not match TT in partial specialization
eval<E<int, float>> eE; // error: E does not match TT in partial specialization

——结束示例 ]

(强调我的)

【讨论】:

    【解决方案2】:

    [temp.arg.template] 描述了模板模板参数如何与相应的参数匹配。特别是 C++11 14.3.3/3 说

    当P的template-parameter-list包含模板参数包时,模板参数包会匹配template-parameter-list中的零个或多个模板参数或模板参数包 em> 的 A 与 P 中的模板参数包具有相同的类型和形式

    其中 P 是参数(在您的示例中为U),A 是参数(在您的示例中为A)。所以你的例子,只有一个参数包,将匹配一个带有任意数量类型参数的模板。

    【讨论】:

    • 嗯。我无法决定选择您的答案还是 Angew 的答案....但由于其简单性,我最终将接受您的答案。 (但是我仍然不愿意选择其中一个>o
    猜你喜欢
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2014-04-12
    相关资源
    最近更新 更多