【问题标题】:Prevent two classes from inheriting from a base class with same template arguments防止两个类从具有相同模板参数的基类继承
【发布时间】:2011-03-14 12:18:12
【问题描述】:

我有一个假设是基类的类:

template<int ID>
class BaseClass { ... };

如果两个类尝试使用相同的 ID 值从这个基类继承,我怎么能出现编译时错误。也就是说 - 这段代码应该可以工作:

class A : BaseClass<1> { ... }
class B : BaseClass<2> { ... }

但是这段代码应该会导致错误:

class A : BaseClass<1> { ... }
class B : BaseClass<1> { ... }

如何实现这一目标? BOOST_STATIC_ASSERT 有帮助吗?

【问题讨论】:

  • 你的意思是BaseClass而不是第二个和第三个sn-p中的ID,我猜?
  • @Bartłomiej:我想你想写 class A : BaseClass&lt;1&gt; { ... } 而不是 class A : ID&lt;1&gt; { ... }
  • 你是对的 - 它应该是BaseClass。我的错。
  • 只是一个问题,我们什么时候可以从中受益?我的意思是你为什么要这样做?
  • 我认为甚至可以证明这是不可能的。首先,即使使用非模板类,您也无法做到这一点。这就是为什么。如果可以一次完成,您可以复制所有相同的文件,只需更改派生类的名称,您将得到两个实现。请记住,C/C++ 中的模块化是通过直接基于文本的包含来实现的。

标签: c++ templates inheritance boost assert


【解决方案1】:

我认为这是不可能的。

如果可能的话,我们可以让编译器也为下面的代码生成错误,这在概念上和你的代码是等价的。

struct Base {};
struct OtherBase {};

struct A : Base {}; //Base is used here!
struct B : Base {}; // error - used base class. please use some other base!
struct C : OtherBase {}; // ok - unused based!

【讨论】:

  • 也许可以使用宏...只是假设,实际上我不知道方法。
【解决方案2】:

只是猜测,但如果您想生成唯一类型 ID,您可能需要查看 thisthis 问题。

【讨论】:

    【解决方案3】:

    在编译时我想不出任何可能的解决方案,使用 C++。

    我可以在启动时(库初始化)想到一个可能的解决方案,但它会受到限制。

    class A: public Base<A,1> {};
    

    我们有Base在库初始化过程中注册了id1和类typeid(A)的对应关系。如果存在 id 并且类不同意,则停止启动。

    但是有一个警告:

    class A: public Base<A,1> {};
    
    class C: public A {};
    class D: public A {};
    

    没有什么可以防止派生自 A 的类发生冲突。

    我可以建议静态分析:选择一个 C++ 解析器并编写一个预提交挂钩,该挂钩将检查修改后的文件并查看它们是否会引入冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2016-04-19
      • 1970-01-01
      • 2014-07-15
      • 2012-05-12
      • 2014-09-12
      • 2011-05-29
      相关资源
      最近更新 更多