2011-08-16 68 views
1

在我的項目之一,我有下面的類模板層次:模板簡化

template <typename FruitType, typename ParentFilterType = void> 
class filter; 

template <typename FruitType> // Specialization when no parent filter is needed 
class filter<FruitType, void>; 

哪裏FruitType可以是任何東西。假設它是apple,bananaorange之一。 所以基本上,一個filter可以有自己的filter類型。

filter代碼無法控制:它必須保持,因爲它是

用戶代碼通常是這樣的:

filter<apple, filter<banana, filter<orange> > > my_apple_filter; 

顯然,這是一個有點冗長。我想知道是否有可能獲得更可讀的東西。喜歡的東西:

complex_filter<apple, banana, orange>::type my_apple_filter; 

complex_filter<apple, banana, orange>::type將解析爲filter<apple, filter<banana, filter<orange> > >

我試過complex_filter是一個struct模板,裏面有typedef但目前還沒有成功。模板參數的數量應該是可變的(從1到5)。

你有沒有想過類似的東西?我怎麼能這樣做?

(我遺憾的是不能使用的C++ 0x,但如果有一個與它一個更好的解決方案,隨意張貼,因爲它是一件好事,知道)

謝謝。

+0

你可以使用boost嗎? boost :: mpl有類型向量和metafucntions可以讓你做這樣的事情 – PlasmaHH

+0

@PlasmaHH:是的,我可以。 – ereOn

+0

C++ 03或C++ 0x?在C++ 0x中,您可以使用可變參數模板來簡化語法 –

回答

4

在C++ 0x中,這將是可變參數模板。

沒有C++ 0x,您可以簡單地使用大量參數,並提供默認值。

template <typename F0, typename F1 = void, typename F2 = void, typename F3 = void> 
struct complex_filter 
{ 
    typedef filter<F0, typename complex_filter<F1, F2, F3>::type> type; 
}; 

template <> 
struct complex_filter<void,void,void,void> 
{ 
    typedef void type; 
}; 

這可以被用來作爲你想要的,你必須手動擴展它,如果你想更多的參數。

+0

非常感謝!正是我想要的。 (我只是用'struct'替換'class',但是我猜這是一個錯字,因爲'type'不能被其他用戶訪問) – ereOn

+0

@ereOn:Oups ...感謝修復:) –

0

你嘗試過什麼應該工作,排序:

template< class A, class B > 
struct complex_filter2 
{ 
    typedef typename filter< A, filter<B> > type; 
}; 

template< class A, class B, class C > 
struct complex_filter3 
{ 
    typedef typename filter< A, filter< B, filter<C> > > type; 
}; 

//etc 
+0

而且,是的,你必須專注於每個維度......至少在C++ 0x之前! –

+0

謝謝你的回答。是否有任何解決方案不需要編寫'N'不同的'complex_filter''結構'模板? @Tomalak Geret'kal:僅用於學習目的:C++ 0x提供哪些幫助? – ereOn

+0

@ereOn:C++ 0x提供可變參數模板,即處理先驗未知數量參數的能力。 –