2012-07-18 76 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