混合可变参数模板值和可变参数推导类型

时间:2014-01-13 21:09:03

标签: c++ c++11 templates variadic-templates template-deduction

标准是否完美地定义了以下内容?

#include <iostream>

template <unsigned int... Values, class... Types>
void f(Types&&... values)
{
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}

int main()
{
    f<7, 5>(3);
    return 0;
}

它在g++ 4.8下编译得很好,但我想知道它是否正常。

1 个答案:

答案 0 :(得分:2)

来自ISO C++ standard's current working draft 14.1(11):

  

函数模板的模板参数包不能跟随另一个模板&gt;参数,除非该模板参数可以从&gt;函数模板的参数类型列表中推导出来,或者具有默认参数

在您的情况下,“类型”是函数参数包,“值”,即模板参数包,可以始终跟随函数参数包。 此代码的作用也是出于同样的原因:

#include <iostream>

template <class... Values, class... Types>
void f(Types&&... values)
{
    std::cout<<sizeof...(Values)<<" "<<sizeof...(Types)<<std::endl;
}

int main()
{
    f<int, float>(-3, 5);
    return 0;
}