继续my journey into the world of variadic templates,我遇到了另一个问题。具有多个模板参数包的部分模板专业化
假设下面的模板类:
template < typename T >
struct foo
{
//default implementation
};
有可能部分专门它的可变参数模板实例是这样的:
template < template < typename ... > class T, typename ...Args >
struct foo< T<Args...> >
{
//specialized implementation
};
有了这个,foo<int>
将对应于默认的实现和foo< std::tuple< int, char > >
到专门的实施。
但是,使用多个模板参数时,事情会变得更加复杂。例如,如果我们有如下的模板类
template < typename T, typename U >
struct bar {};
,我们希望部分专门它,因为我们没有为foo
,我们不能做
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> > {};
//This would correspond to the specialized version with
//T=std::tuple,
//TArgs=int,char
//U=std::tuple,
//UArgs=float
bar< std::tuple< int, char >, std::tuple<float> > b;
事实上,如果我是正确的,我们只能有一个模板参数包,它必须位于参数列表的末尾。我明白为什么在模板声明中这是强制性的,但对于某些部分模板特殊化(如上面的示例),这不应该成为问题。
是否有可能通过多个模板参数包实现部分模板特化?
编辑:现在我觉得很傻...我给上面的代码完全编译(至少用gcc 4.5)。我的编译错误不是因为多个参数包,而是因为它们用作成员函数参数。在bar
局部特殊化,我试图定义一个成员函数,它都TArgs
和UArgs
参数:
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> >
{
void method(TArgs... targs, UArgs... uargs) //compile error here
{
}
};
在成员函数声明,海湾合作委员会给我的错误
参数包必须是在参数列表的末尾。
据我所知,编译器应该能够为给定的模板实例化定义正确的成员函数,例如, bar< std::tuple< int, char >, std::tuple<float> >
应该包含一个成员函数void method(int, char, float)
。难道我做错了什么?或者我想做一些不可能的事情?如果是这样,那么为什么这是不可能的吗?
整洁,我不知道你可以专门化/指定(模板列表的一部分)作为模板本身的元素。 – JAB