考虑:
#include<tuple>
template<int N,typename... Vs,typename... Ts>
void fog( const std::tuple<Vs...>& vs , const std::tuple<Ts...> & ts )
{
}
template<typename...Vs,typename...Ts >
int gof( const std::tuple<Vs...>& vs , const std::tuple<Ts...> & ts )
{
fog<0,Vs...,Ts...>(vs,ts);
}
int main()
{
std::tuple<int,double> t;
gof(t,t);
}
为什么编译器(g ++-4.6)找不到fog
函数以及如何找到它?
error: no matching function for call to ‘fog(const std::tuple<int, double>&, const std::tuple<int, double>&)’
note: candidate is:
note: template<int N, class ... Vs, class ... Ts> void fog(const std::tuple<Vs ...>&, const std::tuple<_Tail ...>&)
是的,我需要整数模板参数N
。 (这是一个简单的例子。)
答案 0 :(得分:6)
不要展开参数包:
fog<0>(vs,ts);
否则编译器不知道哪个模板参数属于哪个元组。这样,元组的模板参数就像往常一样被扣除。
答案 1 :(得分:5)
写:
fog<0>(vs,ts);
而不是
fog<0,Vs...,Ts...>(vs,ts);
让编译器推断出类型。
至于为什么第二种形式不起作用,因为variadic参数只能是最后一个参数。该表单不能有两个可变参数模板参数。