Запретить наследование двух классов от базового класса с одинаковыми аргументами шаблона - PullRequest
6 голосов
/ 14 марта 2011

У меня есть класс, который, как предполагается, является базовым классом:

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

Как я могу сделать ошибку времени компиляции, если два класса пытаются наследовать от этого базового класса, используя одно и то же значениеЯ БЫ.То есть - предполагается, что этот код работает:

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

Но этот код должен вызывать ошибку:

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

Как этого добиться?BOOST_STATIC_ASSERT помогает?

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Просто угадайте, но если вы хотите сгенерировать уникальные идентификаторы типов, вы можете проверить этот и этот вопрос.

1 голос
/ 14 марта 2011

Я думаю, что это невозможно.

Если бы это было возможно, то мы можем заставить компилятор генерировать ошибку и для следующего кода, который концептуально эквивалентен вашему коду.

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!
0 голосов
/ 14 марта 2011

Я не могу придумать ни одного возможного решения во время компиляции, используя C ++.

Я могу подумать о возможном решении во время запуска (инициализация библиотеки), но оно будет ограничено.

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

У нас Base регистрируется соответствие между идентификатором 1 и классом typeid(A) во время инициализации библиотеки. Если идентификатор существует, а классы не согласны, остановите запуск.

Однако есть одна оговорка:

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

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

Ничто не мешает классам, производным от A, конфликтовать.

Я могу предложить статический анализ: подобрать синтаксический анализатор C ++ и запрограммировать обработчик предварительной фиксации, который проверит измененные файлы и посмотрит, нет ли в них конфликта.

...