防止两个类从具有相同模板参数的基类继承

时间:2011-03-14 12:18:12

标签: c++ templates inheritance boost assert

我有一个假定为基类的类:

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有帮助吗?

3 个答案:

答案 0 :(得分: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!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在编译时我无法想到使用C ++的任何可能的解决方案。

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

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

我们在库初始化期间Base注册了id 1和类typeid(A)之间的对应关系。如果存在id且类不一致,则停止启动。

但有一点需要注意:

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

class C: public A {};
class D: public A {};

没有什么能阻止从A派生的类发生冲突。

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

相关问题