【问题标题】:Template Parameters Mutually Exclusive模板参数互斥
【发布时间】:2012-07-19 04:34:41
【问题描述】:

我有一个带有多个模板参数的模板。

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

参数的值是互斥的: 即对于 Appl 的每个值,StoredData 只允许一组特定的类型。

例如:Appl 是 List、StoredData - double、char Appl 是树,StoredData - int

有没有办法在编译时强制执行这个限制? 所以,

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

【问题讨论】:

  • 只取Appl 类型并使用部分特化进行自定义映射。
  • Boost.MPL + 静态断言会很好。
  • 或者只是将StoredData 类型设为Appl 类型的内部typedef 并执行typedef typename Apply::stored_data_type store_type;。如果你愿意,我可以稍后为这两个选项写一个答案。

标签: c++ templates


【解决方案1】:

是的,有:

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,尝试更改一些类型,它将无法编译。

【讨论】:

  • 另请注意,这可以在 C++11 中推广为将 Appl 组合到有效 StoredData 类型列表中,这样您就可以减少样板代码。
  • 谢谢。我想那会奏效。但只是想知道,如果我可以部分专注于 App1,是否有一种更简洁的方法来做到这一点 - 无需明确说明所有选项。
  • @excalibur:这取决于您到底想要达到什么目标,而不仅仅是“让它与这样那样的类型一起工作”。你没有说你想做什么,所以我无能为力。虽然回答了您的问题,但我确定这不是您问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-07-29
  • 2017-01-03
  • 2014-03-10
  • 1970-01-01
  • 2013-07-07
  • 2020-07-14
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多