繼續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