2012-07-18 79 views
2

我有一個包含多個模板參數的模板。模板參數互斥

template<typename Appl, typename StoredData> 
    class Box { 
    }; 

的參數的值是互相排斥的: 即對於申請的每一個值,僅存在一組特定的允許StoredData類型。

例如:申請是列表,StoredData - 雙,焦炭 申請的樹,StoredData - 詮釋

有沒有辦法強制在編譯時這個限制? 所以,

 Box<List, double> - compiles 
    Box<List, int> - fails 
    Box<Tree, int> - compiles 
+1

只需要'Appl'類型並使用部分專業化進行自定義映射。 – Xeo 2012-07-18 20:28:26

+0

[Boost.MPL](http://www.boost.org/libs/mpl/)+一個靜態斷言將很好地完成。 – ildjarn 2012-07-18 20:28:39

+2

或者只是將'StoredData'類型作爲'Appl'類型的內部typedef並且執行'typedef typename Apply :: stored_data_type store_type;'。如果你願意,我可以在稍後寫出對這兩個選項的答案。 – Xeo 2012-07-18 20:33:07

回答

4

是的,有:

template<typename Appl, typename StoredData> 
    class Box { 
     static_assert(
      std::is_same<Appl, List>::value && std::is_same<StoredData, double>::value || 
      std::is_same<Appl, Tree>::value && std::is_same<StoredData, int>::value, 
      "Bad parameters" 
     ); 
    }; 

這裏是工作示例http://ideone.com/enECW,嘗試改變某些類型的,它會編譯失敗。

+0

還要注意,這可以在C++ 11中進行推廣,以將'Appl'組合成有效的'StoredData'類型列表,以便減少鍋爐板代碼。 – 2012-07-18 20:41:59

+0

謝謝。我想這會起作用。但只是想知道,如果我可以部分專注於App1,是否會有一種更簡潔的方式來實現這一點 - 而無需明確地說明所有選項。 – excalibur 2012-07-19 13:14:20

+0

@excalibur:它取決於你想要達到什麼目的,而不僅僅是「讓它適用於這樣和那樣的類型」。你沒有說你想做什麼,所以我無法幫助超越。雖然回答你的問題,但我相信這不是解決你的問題的方法。 – ybungalobill 2012-07-19 15:16:30